![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Задача сделать из цветной картинки черно-белую, но без серого цвета — то есть можно использовать только 2 цвета: белый и черный.
Пример выполнения кода можно увидеть в прикрепленном изображении. Код:
procedure TForm1.ButtonClick(Sender: TObject); var x, y, kontrast : Integer; begin kontrast := 100; image2.Width := image1.Width; image2.Height := image1.Height; for y := 0 to image1.Height-1 do begin for x := 0 to image1.Width-1 do begin if (GetRValue(Image1.Canvas.Pixels[x, y]) < kontrast) or (GetGValue(Image1.Canvas.Pixels[x, y]) < kontrast) or (GetBValue(Image1.Canvas.Pixels[x, y]) < kontrast) then Image2.Canvas.Pixels[x, y] := clBlack; end; x := 0; end; end; Проблема в том, что картинка у меня размером 2048х1536 пикселей, то есть цикл выполняется 3 145 728 раз и это занимает примерно 20 секунд. Нужно сделать так, чтобы происходило то же самое, но значительно быстрее. Подскажите пожалуйста как это сделать? Если можно — конкретно кусок кода. Спасибо! |
#2
|
|||
|
|||
![]() Метод Canvas.Pixels[x, y] очень медленный, покопай в сторону BitMap.ScanLine, скорость повысишь в большое кол-во раз., а данный алгоритм будет отрабатываться мгновенно.
|
#3
|
|||
|
|||
![]() как-то так:
Код:
procedure TForm1.ButtonClick(Sender: TObject); var x,y,t: integer; c: byte; img: pByteArray; begin t:=128; //порог for y:=0 to image1.Picture.Height-1 do begin img:=image1.Picture.Bitmap.ScanLine[y]; for x:=0 to image1.Picture.Width-1 do begin c:=(img[x*3+0]+img[x*3+1]+img[x*3+2]) div 3; //(r+g+b)/3 if c<t then c:=0 else c:=255; img[x*3+0]:=c; img[x*3+1]:=c; img[x*3+2]:=c; end; end; end; |
#4
|
||||
|
||||
![]() |
#5
|
|||
|
|||
![]() X128, спасибо! Код полностью рабочий, вы не ошиблись.
|