Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование цветной картинки в серо-белую 
:(
    Опции темы
Che modan
Дата 14.10.2003, 11:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нужно цветную картинку вывести в серо-белой гамме. Каким способом ее преобразовать или изобразить?
Т.е. имеется TBitmap, изобразить ее на TCanvas.
  Вверх
stab
Дата 14.10.2003, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



простейший и НЕ самый быстрый способ, быстрее будет через 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;


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Ч
Дата 15.10.2003, 08:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А что известно, насчет быстрого способа? (В первом приближении я примерно так и сделал, попиксельно)
  Вверх
stab
Дата 15.10.2003, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



можно и еще прооптимизировать, но для наглядности лучше так 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;



--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.