Как да преобразувам 32-х битово изображение в 8 битово

Всъщност трябва да конвертирате чертежа в 8-битово изображение в сива скала и да го запишете във файл без палитра. Пиша на Free Paskal, но PixelFormat:= pf8bit не работи там. Моля, вижте носа си в пример как се прави

Y = 0,222 * R + 0,707 * G + 0,071 * B

Няма 8-битово изображение в сивата скала без палитра

защо палитра, ако всеки пиксел се описва с един байт (яркост)

формат явно ще трябва да измислите свой собствен - в заглавката е размерът на картината, а в тялото е масив от байтове. Просто не искам да преоткривам колелото, мислех, че има някакъв знак в BMP файла, че палитрата е сива

> трябва да конвертирате в 8-битово изображение в сива скала > и запазете във файл без палета.

Това са 2 различни задачи. Не е ясно кое трябва да бъде разрешено. Ако и двете, тогава има смисъл да зададете 2 въпроса.

Имахте предвид freepascal? =))) И какво точно се използва? Какво представлява нишката FastLIB? Или ръце от файл? WinAPI? GDI+? А относно формулата - има всякакви разновидности, често средната се счита за проста: (R+G+B) div 3;

> Имахте предвид freepascal? =)))да :)> Какво точно се използва? Какво представлява нишката FastLIB? Или на ръка > от файл? WinAPI? GDI+?Зареждам по стандартни методи в Bitmap, след това променям ширината, височината и преобразувам в нива на сивото, след което трябва да го запишете във файл с минимален размер, - тук е приставката, както PixelFormat вече писа: = pf8bit не работи

Трябва ли сами да измислим файловия формат?

procedure TForm1.Button1Click(Sender: TObject); var jpg: TJpegImage; begin; jpg:=TJpegImage.Create; jpg.LoadFromFile("MM.jpg"); jpg.Grayscale:=true; jpg.DIBNeeded; jpg.Компресиране; jpg.SaveToFile("MMGray.jpg"); jpg.безплатно; край;

> Няма 8-битово изображение в нива на сивото без палитраима и има

за какво? ако:> често се взема предвид средната стойност: (R+G+B) div 3;тогава един байт е достатъчен!

>> стандартни методи в Bitmap

Какво представляват "стандартните методи" и какво е Bitmap? tagBitmap от Windows.h?

"8 бита (1 байт) - 256 цвята, последният от режимите, които поддържат индексирани цветове" "8 - до 256 цвята в палитрата, всеки байт от изображението съхранява индекс в палитрата за един пиксел."

Сега не съм сигурен, че идват без палитра.

В delphi направих нещо подобно (за bmp) тип LogPal = запис lpal : TLogPalette; думи:Масив[0..255] от TPaletteEntry; край;

var Pal: LogPal; HPal: HPALETTE = 0;

функция GrayPalette: HPALETTE; . функция GrayPalette: HPALETTE; // създаден 1 път var i: Integer; begin Result := HPal; ако HPal <> 0 след това изход; Pal.lPal.palVersion:=$300; Pal.lPal.palNumEntries:=256; за i := 0 до 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; край; HPal := CreatePalette(Pal.lpal); Резултат := HPal; край; . в програмата Image.Picture.Bitmap.PixelFormat := pf8bit; Image.Picture.Bitmap.Palette:= GrayPalette;

Запазете нормално, когато се запази

При човек не Delphi. Как да конвертирате в сиво - в първия пост. И как да запазите - Нещо като този Unit SaveBMP; интерфейс

procedure Save_BMP ( const FileName : String; const A : масив от масив от Byte; He , Wi :Integer );

изпълнение употребиWindows; процедура Save_BMP ( const FileName : String; const A : масив от масив от байтове; He , Wi :Integer ); //-------------------------------------------------------------------------- var F:File;

B : масив от байтове; BFH: TBitmapFileHeader; //Word bfType ; //DWord bfSize ; //DWord bfReserved ; //DWord bfOffBits ; //BFH-------------------------------- Wi16,Делта :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;

начало //SaveBMP; с BIH, BFH започват biSize := 40; bfType := $4D42; bfReserved1 := 0; bfReserved2 := 0;

двуравнини := 1; biBitCount := 8; biHeight := Той; biW > бикомпресия := 0; biXPelsPerMeter := 0; biYPelsPerMeter := 0; biClrUsed := 256; biClrВажно := 0;

Делта := biWidth mod 4; ако (Делта<>0) тогава Делта:=4-Делта; Wi16 := делта + biWidth;

biSizeImage := Delta * biHeight; bfSize := bfOffBits+biSizeImage;

за i:=0 до 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); край;//Запазване на BMP край.