-
Такая проблема. Приведу две процедуры и функции:
function bcolor(c:TColor):byte; var x:longword; r,g,b:byte; begin x:=longword(c); r:=x and $ff; g:=(x shr 8) and $ff; b:=(x shr 16) and $ff; result:=(r+g+b) div 3; end;
function fimage(x,y:real):byte; var w,h,i,j:integer; a,b,z:real; cx1,cx2,color1,color2:byte; begin w:=BMP.Width; h:=BMP.Height; z:=x*(w-1); i:=trunc(z); a:=frac(z); z:=y*(h-1); j:=trunc(z); b:=frac(z); with BMP.canvas do begin cx1:=bcolor(Pixels[i,j]); cx2:=bcolor(Pixels[i+1,j]); color1:=round(cx1*(1-a) + cx2*a); cx1:=bcolor(Pixels[i,j+1]); cx2:=bcolor(Pixels[i+1,j+1]); color2:=round(cx1*(1-a) + cx2*a); end; result:=round(color1*(1-b) + color2*b); end;
procedure TForm1.putimage(cv:TCanvas); var i,j:integer; w,h:integer; hx,hy,x,y:real; color:byte; begin w:=cv.ClipRect.Right; h:=cv.ClipRect.Bottom; hx:=1/w; hy:=1/h; for i:=1 to w-1 do for j:=1 to h-1 do begin x:=i*hx; y:=j*hy; { color:=fimage(x,y);} cv.Pixels[i,j]:=paintbox1.canvas.pixels[round(x),round(y)]; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin putimage(paintbox2.canvas); end;
procedure TForm1.BitBtn1Click(Sender: TObject); var MyRect, MyOther: TRect; begin if OpenPictureDialog1.Execute then begin BMP:=TBitMap.Create; BMP.LoadFromFile(OpenPictureDialog1.FileName); MyRect := Rect(16,20,27,32); with paintbox1.Canvas do CopyRect(MyRect,BMP.Canvas,MyRect); with BMP.Canvas do CopyRect(ClipRect,paintbox1.Canvas,MyRect); end; end;
Они обращают цвет и маштабирует рисунок хранящийся в BMP . И переводятся в paintbox1.canvas . Но проблема, что после по обращению по пиксельно (paintbox1.canvas.pixels[i,j]) вы водятся странные 8ми значные числа хотя изображение чернобелое. причем и черный и белый цвет обозначается одной цифрой. В чем дело?
-
Pixels всегда возращает цвет в формате BBGGRR, например, белый цвет это $FFFFFF, в десятичном виде 16777215, вот вам и 8-значное число. Но в приведённом коде это не должно создавать проблем (за исключением низкой скорости от излишних преобразований) - функция bcolor как раз и делает преобразование из BBGGRR в градации серого.
|