![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как преобразовать 32-х битное изображение в 8 битное
Сергей © (2012-09-25 12:05:00)Собственно, нужно преобразовать рисунок в 8 битное изображение в оттенках серого, и сохранить в файл без палитры.
пишу в Free Paskal, но там не работает PixelFormat:= pf8bit.
ткните плз носом в пример как это сделать
icWasya (2012-09-26 09:54:00) [1]У человека не 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.
SergeyIT (2012-09-25 22:13:00) [2]В дельфи как то так делал (для бмп)
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;
При сохранении нормально сохранят
Edgar_Wine (2012-09-25 21:43:00) [3]>> стандартными методами в Bitmap
Что же есть "стандартные методы" и что за Bitmap? tagBitmap из Windows.h?
« 8 бит (1 байт) — 256 цветов, последний из режимов, поддерживавших индексированные цвета»
« 8 — в палитре содержится до 256 цветов, каждый байт изображения хранит индекс в палитре для одного пикселя.»
Теперь я не уверен что они бывают без палитры.
brother (2012-09-25 17:27:00) [4]а зачем? если:
> частенько прост среднее считается: (R+G+B) div 3;
значит байта хватит!
QAZ2 (2012-09-25 17:09:00) [5]
> 8 битное изображение в оттенках серого без палитры не бывает
бывает и есть
Sha (2012-09-25 16:49:00) [6]
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;
Sha (2012-09-25 14:54:00) [7]формат файла нам самим придумать?
Сергей (2012-09-25 14:40:00) [8]
> Вы имели ввиду FreePascal? =)))
да :)
> А что именно используется-то? Какой-нить FastLIB? Или руками
> из файла? WinAPI? GDI+?
Гружу стандартными методами в Bitmap, после меняю ширину, высоту и перевожу в оттенки серого, дальше нужно сохранять в файл с минимальным размером, - вот тут и затык, как уже писал PixelFormat:= pf8bit не работает
Edgar_Wine (2012-09-25 13:24:00) [9]Вы имели ввиду FreePascal? =)))
А что именно используется-то? Какой-нить FastLIB? Или руками из файла? WinAPI? GDI+?
А насчёт формулы - там разновидности любые, частенько прост среднее считается: (R+G+B) div 3;
Inovet (2012-09-25 13:09:00) [10]> [7] Сергей (25.09.12 12:56)
TIFF Какой-нибудь?
Sha (2012-09-25 13:06:00) [11]
> нужно преобразовать в 8 битное изображение в оттенках серого
> и сохранить в файл без палитры.
Это 2 разных задачи.
Непонятно, какая требует решения.
Если обе, то имеет смысл задать 2 вопроса.
Сергей (2012-09-25 12:56:00) [12]формат видимо прийдется свой придумывать - в заголовке размер картинки, а в теле массив байт. просто не хочется изобретать велосипед, думал в BMP файле есть какой-то признак, что палитра серая
Inovet (2012-09-25 12:50:00) [13]> [5] брат Птибурдукова (25.09.12 12:46)
У автора ничего не сказано о формате файла.
брат Птибурдукова (2012-09-25 12:46:00) [14]
> Inovet © (25.09.12 12:41) [3]
Это буквально. Если просто поприсваивать получившийся в [1] Y в качестве цвета (то есть индекса палитры), то картинка получится разноцветной, но никак не в оттенках серого. А для "8 битное изображение в оттенках серого" надо явно прописывать палитру.
Сергей (2012-09-25 12:44:00) [15]а зачем палитра если каждый пиксел описан одним байтом (яркость)
Inovet (2012-09-25 12:41:00) [16]> [2] icWasya © (25.09.12 12:36)
> 8 битное изображение в оттенках серого без палитры не бывает
Это как? А 4-х или 1-но битное бывает?
icWasya (2012-09-25 12:36:00) [17]8 битное изображение в оттенках серого без палитры не бывает
Inovet (2012-09-25 12:26:00) [18]Y = 0,222 * R + 0,707 * G + 0,071 * B
http://ru.wikipedia.org/wiki/RGB