Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.31;
Скачать: CL | DM;

Вниз

Как преобразовать 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
15-1354977257
dummy_user
2012-12-08 18:34
2013.03.31
Выбор из 2-х реализаций абстракции.


15-1354371990
AlexKniga
2012-12-01 18:26
2013.03.31
Использование ICQ и права на текст сообщений


15-1354157936
Медвежонок Пятачок
2012-11-29 06:58
2013.03.31
марсиане таки существуют? :)


15-1353699619
Пит
2012-11-23 23:40
2013.03.31
ЖКХ развод?


15-1354981340
dummy_user
2012-12-08 19:42
2013.03.31
Как это называется...