Конференция "Media" » Обращение цевта и маштабирование [D7, WinXP]
 
  • MIKron (05.04.08 09:05) [0]
    Такая проблема. Приведу две процедуры и функции:

    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ми значные числа хотя изображение чернобелое. причем и черный и белый цвет обозначается одной цифрой. В чем дело?
  • Sapersky (06.04.08 13:21) [1]
    Pixels всегда возращает цвет в формате BBGGRR, например, белый цвет это $FFFFFF, в десятичном виде 16777215, вот вам и 8-значное число.
    Но в приведённом коде это не должно создавать проблем (за исключением низкой скорости от излишних преобразований) - функция bcolor как раз и делает преобразование из BBGGRR в градации серого.
 
Конференция "Media" » Обращение цевта и маштабирование [D7, WinXP]
Есть новые Нет новых   [133928   +471][b:0][p:0]