Форум: "Начинающим";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];
ВнизКак преобразовать 32-х битное изображение в 8 битное Найти похожие ветки
← →
Сергей (2012-09-25 12:05) [0]Собственно, нужно преобразовать рисунок в 8 битное изображение в оттенках серого, и сохранить в файл без палитры.
пишу в Free Paskal, но там не работает PixelFormat:= pf8bit.
ткните плз носом в пример как это сделать
← →
Inovet © (2012-09-25 12:26) [1]Y = 0,222 * R + 0,707 * G + 0,071 * B
http://ru.wikipedia.org/wiki/RGB
← →
icWasya © (2012-09-25 12:36) [2]8 битное изображение в оттенках серого без палитры не бывает
← →
Inovet © (2012-09-25 12:41) [3]> [2] icWasya © (25.09.12 12:36)
> 8 битное изображение в оттенках серого без палитры не бывает
Это как? А 4-х или 1-но битное бывает?
← →
Сергей (2012-09-25 12:44) [4]а зачем палитра если каждый пиксел описан одним байтом (яркость)
← →
брат Птибурдукова (2012-09-25 12:46) [5]
> Inovet © (25.09.12 12:41) [3]
Это буквально. Если просто поприсваивать получившийся в [1] Y в качестве цвета (то есть индекса палитры), то картинка получится разноцветной, но никак не в оттенках серого. А для "8 битное изображение в оттенках серого" надо явно прописывать палитру.
← →
Inovet © (2012-09-25 12:50) [6]> [5] брат Птибурдукова (25.09.12 12:46)
У автора ничего не сказано о формате файла.
← →
Сергей (2012-09-25 12:56) [7]формат видимо прийдется свой придумывать - в заголовке размер картинки, а в теле массив байт. просто не хочется изобретать велосипед, думал в BMP файле есть какой-то признак, что палитра серая
← →
Sha © (2012-09-25 13:06) [8]
> нужно преобразовать в 8 битное изображение в оттенках серого
> и сохранить в файл без палитры.
Это 2 разных задачи.
Непонятно, какая требует решения.
Если обе, то имеет смысл задать 2 вопроса.
← →
Inovet © (2012-09-25 13:09) [9]> [7] Сергей (25.09.12 12:56)
TIFF Какой-нибудь?
← →
Edgar_Wine (2012-09-25 13:24) [10]Вы имели ввиду FreePascal? =)))
А что именно используется-то? Какой-нить FastLIB? Или руками из файла? WinAPI? GDI+?
А насчёт формулы - там разновидности любые, частенько прост среднее считается: (R+G+B) div 3;
← →
Сергей (2012-09-25 14:40) [11]
> Вы имели ввиду FreePascal? =)))
да :)
> А что именно используется-то? Какой-нить FastLIB? Или руками
> из файла? WinAPI? GDI+?
Гружу стандартными методами в Bitmap, после меняю ширину, высоту и перевожу в оттенки серого, дальше нужно сохранять в файл с минимальным размером, - вот тут и затык, как уже писал PixelFormat:= pf8bit не работает
← →
Sha © (2012-09-25 14:54) [12]формат файла нам самим придумать?
← →
Sha © (2012-09-25 16:49) [13]
procedure TForm1.Button1Click(Sender: TObject);
var
jpg: TJpegImage;
begin;
jpg:=TJpegImage.Create;
jpg.LoadFromFile("MM.jpg");
jpg.Grayscale:=true;
jpg.DIBNeeded;
jpg.Compress;
jpg.SaveToFile("MMGray.jpg");
jpg.free;
end;
← →
QAZ2 (2012-09-25 17:09) [14]
> 8 битное изображение в оттенках серого без палитры не бывает
бывает и есть
← →
brother © (2012-09-25 17:27) [15]а зачем? если:
> частенько прост среднее считается: (R+G+B) div 3;
значит байта хватит!
← →
Edgar_Wine (2012-09-25 21:43) [16]>> стандартными методами в Bitmap
Что же есть "стандартные методы" и что за Bitmap? tagBitmap из Windows.h?
«8 бит (1 байт) — 256 цветов, последний из режимов, поддерживавших индексированные цвета»
«8 — в палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пикселя.»
Теперь я не уверен что они бывают без палитры.
← →
SergeyIT © (2012-09-25 22:13) [17]В дельфи как то так делал (для бмп)
type
LogPal = record
lpal : TLogPalette;
dummy:Array[0..255] of TPaletteEntry;
end;
var
Pal: LogPal;
HPal: HPALETTE = 0;
function GrayPalette: HPALETTE;
.........
function GrayPalette: HPALETTE; // создается 1 раз
var
i: Integer;
begin
Result := HPal;
if HPal <> 0 then
exit;
Pal.lPal.palVersion:=$300;
Pal.lPal.palNumEntries:=256;
for i := 0 to 255 do
begin
Pal.lpal.PalpalEntry[i].peRed := i;
Pal.lpal.PalpalEntry[i].peGreen := i;
Pal.lpal.PalpalEntry[i].peBlue := i;
Pal.lpal.PalpalEntry[i].peFlags := 0;
end;
HPal := CreatePalette(Pal.lpal);
Result := HPal;
end;
.....................
в программе
Image.Picture.Bitmap.PixelFormat := pf8bit;
Image.Picture.Bitmap.Palette:= GrayPalette;
При сохранении нормально сохранят
← →
icWasya © (2012-09-26 09:54) [18]У человека не Delphi. Как преобразовать в серое - в первом посте.
А как сохранить - Примерно такUnit SaveBMP;
interface
procedure Save_BMP ( const FileName : String;
const A : array of array of Byte;
He , Wi :Integer );
implementation
uses Windows;
procedure Save_BMP ( const FileName : String;
const A : array of array of Byte;
He , Wi :Integer );
//---------------------------------------------------------------------------
var
F:File;
i , j:Integer;
B : array of Byte;
BFH: TBitmapFileHeader;
//Word bfType ;
//DWord bfSize ;
//DWord bfReserved ;
//DWord bfOffBits ;
//BFH--------------------------------
Wi16,Delta :LongInt;
BIH:TBitmapInfoHeader;
//Longint biSize ;
//Longint biWidth ;
//Longint biHeight ;
//Word biPlanes ;
//Word biBitCount ;
//
//DWord biCompression ;
//DWord biSizeImage ;
//Longint biXPelsPerMeter ;
//Longint biYPelsPerMeter ;
//DWord biClrUsed ;
//DWord biClrImportant ;
//BIH-----------
Color :TColorRef;
begin //SaveBMP;
with BIH,BFH do begin
biSize := 40;
bfType := $4D42;
bfReserved1 := 0;
bfReserved2 := 0;
biPlanes := 1;
biBitCount := 8;
biHeight := He;
biWidth := Wi;
biCompression := 0;
biXPelsPerMeter := 0;
biYPelsPerMeter := 0;
biClrUsed := 256;
biClrImportant := 0;
bfOffBits := 1078;
Delta := biWidth mod 4;
if (Delta<>0) then Delta:=4-Delta;
Wi16 := Delta + biWidth;
biSizeImage := Delta * biHeight;
bfSize := bfOffBits+biSizeImage;
end;
SetLength(B,Wi16);
FillChar(B[0],Wi16,0);
AssignFile(F,FileName);
Rewrite(F,1);
BlockWrite(F,BFH,SizeOf(BFH));
BlockWrite(F,BIH,SizeOf(BIH));
for i:=0 to 255 do begin
Color:=$010101 * i;
BlockWrite(F,Color,SizeOf(Color));
end;
//for i:=He-1 downto 0 do begin
for i:=0 to He-1 do begin
for j:=0 to Wi-1 do begin
B[j] := A[i,j];
end;
BlockWrite(F,B[0],Wi16);
end;
CloseFile(F);
end;//Save BMP
end.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c