Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];

Вниз

Как преобразовать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
3-1287382954
kudatsky
2010-10-18 10:22
2013.03.31
Чем грозят длинные транзакции в FireBird ?


2-1348840806
dm_member
2012-09-28 18:00
2013.03.31
Ошибка чтения разнотипных данных из TFileStream


15-1354548217
Александр
2012-12-03 19:23
2013.03.31
Delphi, помощь в составлении программы.


15-1354718984
Kerk
2012-12-05 18:49
2013.03.31
Начальники


15-1354711862
Error0xDEADBEEF
2012-12-05 16:51
2013.03.31
VirtualBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский