![]()  | 
	
 
  | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Доброго  времени суток Знатоки! Есть следующая проблема: есть у меня функция для преобразования 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  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Переписал, оказывается не все так сложно как показалось 
		
	
		
		
		
		
		
	
		
		
	
	
	  Не уверен что код оптимизирован, однако 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; |