Як перетворити 32-х бітне зображення в 8-бітне
Власне, потрібно перетворити малюнок на 8 бітне зображення у відтінках сірого, і зберегти файл без палітри. пишу в Free Paskal, але там не працює PixelFormat:= pf8bit. ткніть плз носом у приклад як це зробити
Y = 0,222 * R + 0,707 * G + 0,071 * B http://ua.wikipedia.org/wiki/RGB
8 бітне зображення у відтінках сірого без палітри не буває
а навіщо палітра якщо кожен піксел описаний одним байтом (яскравість)
формат мабуть прийде свій придумувати - в заголовку розмір картинки, а в тілі масив байт. просто не хочеться винаходити велосипед, думав у BMP файлі є якась ознака, що палітра сіра
> потрібно перетворити на 8 бітне зображення у відтінках сірого > і зберегти файл без палітри.
Це 2 різні завдання. Незрозуміло, яка вимагає решения. Якщо обидві, то має сенс поставити 2 питання.
Ви мали на увазі FreePascal? =))) А що саме використовується? Який-нитка FastLIB? Або руками із файлу? WinAPI? GDI+? А щодо формули - там різновиди будь-які, частенько простий середнє вважається: (R+G+B) div 3;
> Ви мали на увазі FreePascal? =)))так :)> А що саме використовується? Який-нитка FastLIB? Або руками > із файлу? WinAPI? GDI + ? не працює
формат файлу нам самим вигадати?
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;
> 8 бітне зображення у відтінках сірого без палітри не буваєбуває і є
а навіщо? якщо:> Часто простий середнє вважається: (R+G+B) div 3;означає байта вистачить!
>> стандартними методами у Bitmap
Що ж є "стандартні методи" та що за Bitmap? tagBitmap із Windows.h?
«8 біт (1 байт) — 256 кольорів, останній із режимів, що підтримували індексовані кольори» «8 — у панелі міститься до 256 кольорів, кожен байт зображення зберігає індекс у палітрі для одного пікселя.»
Тепер я не впевнений, що вони бувають без палітри.
У дельфі якось так робив (для бмп) type LogPal = record lpal : TLogPalette; dummy:Array[0..255] of TPaletteEntry; end;
var Pal: LogPal; HPal: HPALETTE = 0;
функція GrayPalette: HPALETTE; . функція 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;
При збереженні нормально збережуть
Людина не Delphi. Як перетворити на сіре - у першому пості. А як зберегти - Приблизно так Unit SaveBMP; interface
procedure Save_BMP (const FileName : String; const A : array of array of Byte; He , Wi :Integer );
implementation usesWindows; procedure Save_BMP ( const FileName : String; const A : масив масиву Byte; He , Wi :Integer ); //---------- -------------------------------------------------- --------------- var F:File;
B : масив байтів; BFH: TBitmapFileHeader; //Слово 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----------- Колір :TColorRef;
початок //Зберегти BMP; з BIH, BFH починаються biSize := 40; bfType := $4D42; bfReserved1 := 0; bfReserved2 := 0;
двоплощини := 1; biBitCount := 8; biHeight := He; biW > бікомпресія := 0; biXPelsPerMeter := 0; biYPelsPerMeter := 0; biClrUsed := 256; biClrВажливо := 0;
Delta := biWidth mod 4; якщо (Дельта<>0), то Дельта:=4-Дельта; Wi16 := Delta + biWidth;
biSizeImage := Delta * biHeight; bfSize := bfOffBits+biSizeImage;
for i:=0 to 255 do begin Color:=$010101 * i; BlockWrite(F,Color,SizeOf(Color)); кінець;
//для i:=He-1 вниз до 0 почати для i:=0 до He-1 почати для j:=0 до Wi-1 почати B[j] := A[i,j]; кінець; BlockWrite(F,B[0],Wi16); кінець; CloseFile(F); end;//Зберегти BMP end.