Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.12.2011, 09:09
medvedoff medvedoff вне форума
Прохожий
 
Регистрация: 27.01.2011
Сообщения: 10
Репутация: 10
По умолчанию FastDib

Доброго времени суток Знатоки! Есть следующая проблема: есть у меня функция для преобразования bmp в монохромное (pf8bit), причем интересненьким методом при помощи коэффицента, реализована она на skyLine, так вот хочется переписать её на fastDib, дабы на нем весь проект держится...ничего не получается. Можете хоть подсказать в какую сторону рыть?
Код:
procedure TForm1.BtseuilClick(Sender: TObject);
var
 rw,i,j,k,l:integer;
 seuil:integer;
 p:pbytearray;
begin
 seuil:=TrackSeuil.Position;
 image1.Picture.Bitmap.Assign(bt);
 rw := (((bt.Width * 32) + 31) and not 31) div 8;
 p:=image1.Picture.Bitmap.ScanLine[bt.Height-1];
 for j:=0 to bt.Height-1 do
 for i:=0 to bt.Width-1 do
 begin
  k:=i*4+j*rw;
  // passe en niveau de gris
  l:=(76*p[k+2]+150*p[k+1]+30*p[k+0]) div 256;
  //suivant le seuil choisi, c'est noir ou blanc
  if l<seuil then l:=0 else l:=255;
  // on met а jour le bitmap
  p[k+2]:=l;
  p[k+1]:=l;
  p[k+0]:=l;
 end;
end;

FastDib вот этот
Ответить с цитированием
  #2  
Старый 16.12.2011, 10:29
medvedoff medvedoff вне форума
Прохожий
 
Регистрация: 27.01.2011
Сообщения: 10
Репутация: 10
По умолчанию

Переписал, оказывается не все так сложно как показалось
Не уверен что код оптимизирован, однако GetTickCount возвращает "15" для bmp 640*480 24bpp, SkyLine не далеко ушел - "16", что не может не радовать. Кстати, фильтр интересный довольно-таки, что-то вроде монохромного дизеринга. Код под FastDib:
Код:
procedure Mono(Bmp:TFastDIB;Split:Integer);
var
  x,y,k: Integer;
  Lin1: PLine24;
  pc: PFColor;
begin
  for y:=0 to Bmp.AbsHeight-1 do
  begin
    Lin1:=Bmp.Scanlines[y];
    for x:=0 to Bmp.Width-1 do
    begin
      k:=(76*Lin1[x].r+150*lin1[x].g+30*lin1[x].b) div 256;
      if k < Split then k:=0 else k:=255;
      Lin1[x].r:=k;
      Lin1[x].g:=k;
      Lin1[x].b:=k;
    end;
  end;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025