Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Grey Scale 256 в Delphi


Автор: ILA 28.9.2002, 09:56
Задача: сделать BMP с 1 битом, а не 3 на пиксел, да и чтобы на принтер было легче. Градации серого в RGB ((256*(256+1)+1)*i), i=0..255, но это ж потом
20MB файл переводить в серый при помощи IrfanView или чего другого.
А так, чтобы сразу рисовать? Одна из присланных мне версий приложена внизу,
но RGB в результате меняются не до 255, а 255/3=85, так что все достаточно черно...
Или есть другие радикальные идеи (этот код слишком медленен)?

Заранее спасибо за помощь !

procedure TForm1.Button1Click(Sender: TObject);
var
  pal: PLogPalette;
  hpal: HPALETTE;
  i: Integer;
  x,y:integer;

begin

    //генерируем картинку
    BitBtn1.click;

    pal:= nil;

   //чтобы цвет задавался не RGB-значением,
   //а индексом из палитры:
   image1.picture.Bitmap.pixelFormat:=pf8bit;

   //начинаем генерировать серую палитру
 try
   //
   GetMem(pal, sizeof(TLogPalette) + sizeof(TPaletteEntry) * 255);
   pal.palVersion := $300;
   pal.palNumEntries := 256;

   //заполняем палитру градациями серого
  for i := 0 to 255 do
   begin
        pal.palPalEntry[i].peRed := i;
        pal.palPalEntry[i].peGreen:=i;
        pal.palPalEntry[i].peBlue :=i;
//         pal.palPalEntry[i].peFlags:=255;
   end;
   //создаем палитру и получаем ее хэнлд (дескриптор)
   hpal := CreatePalette(pal^);
   //если все окэээээй, то
   //новую палитру
   if hpal <> 0 then
      image1.picture.Bitmap.Palette := hpal;

 finally
   FreeMem(pal);
 end;

  //рисуем тестовый серый прямоугольник с меняющейся яркостью:
 for y:=0 to 25 do
 for x:=0 to 255 do
begin
     image1.picture.Bitmap.Canvas.Pixels[400+x,125+y]:=x;
     image1.picture.Bitmap.Canvas.Pixels[400+x,100+y]:=255-x;
end;

end;

Автор: Dexter 28.9.2002, 21:35
Посмотри на фотощопных сайтах,
там есть алгоритм перевода и ЦВ в ЧБ

Автор: ILA 15.10.2002, 08:39
A kak hotelos' by podpravlennyj kod...

Автор: MuToGeN 15.10.2002, 08:56
это тебе хочется не совсем подправленный код, а готовую прогу...
самое простое (правда, не совсем качественное, но это почти незаметно):
Код
Grayscale := (R + G + B) / 3;
среднее арифметическое, то есть.

Автор: ILA 16.10.2002, 08:53
Цитата(MuToGeN @ 15.10.2002, 01:56)
это тебе хочется не совсем подправленный код, а готовую прогу...
самое простое (правда, не совсем качественное, но это почти незаметно):
Код
Grayscale := (R + G + B) / 3;
среднее арифметическое, то есть.

Esli gotovaja programma principial'no otlichaetsja ot nabroska s palette, to da, hochu kusok koda.

A zachem (R+G+B)/3 ??? I hochu _sozdavat'_ risunki srazu v greyscale, a RGB->Grey i pri pomozhi IrfanView sdelat' bez problem.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)