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


Автор: Che modan 14.10.2003, 11:38
Нужно цветную картинку вывести в серо-белой гамме. Каким способом ее преобразовать или изобразить?
Т.е. имеется TBitmap, изобразить ее на TCanvas.

Автор: stab 14.10.2003, 18:02
простейший и НЕ самый быстрый способ, быстрее будет через TBitmap.Scanline

bmp: TBitmap;
cnv: TCanvas;
RGBColor, Gray: TColor;
...

for i := 0 to bmp.Width - 1 do
for j := 0 to bmp.Height - 1 do
begin
RGBColor := bmp.Canvas.Pixels[i, j];
Gray := Round((0.30 * GetRValue(RGBColor)) + (0.59 * GetGValue(RGBColor)) + (0.11 * GetBValue(RGBColor )));
cnv.Pixels[i, j] := RGB(Gray, Gray, Gray);
end;

Автор: Ч 15.10.2003, 08:10
А что известно, насчет быстрого способа? (В первом приближении я примерно так и сделал, попиксельно)

Автор: stab 15.10.2003, 10:13
можно и еще прооптимизировать, но для наглядности лучше так smile.gif

Код

procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: Integer;
 r, g, b, gray: Byte;
 sl: PByteArray;
 APicture: TBitmap;
begin
 APicture := TBitmap.Create;
 APicture.LoadFromFile('c:\test.bmp');
 APicture.PixelFormat := pf24bit;

 for j := 0 to APicture.Height - 1 do
 begin
   sl := APicture.ScanLine[j];
   for i := 0 to APicture.Width - 1 do
   begin
     b := sl[i * 3];
     g := sl[i * 3 + 1];
     r := sl[i * 3 + 2];
     gray := Round((0.30 * r) + (0.59 * g) + (0.11 * b));
     sl[i * 3] := gray;
     sl[i * 3 + 1] := gray;
     sl[i * 3 + 2] := gray;
   end;
 end;

 Form1.Canvas.Draw(0, 0, APicture);
 APicture.Free;
end;

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