Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как преобразовать 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо