Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > функция копирования изображения


Автор: Gigabyte 21.2.2006, 15:07
я пишу программу в которой нужно будет копирывать изображение в нужную точку исключая некий цвет
при этом это изображение нужно часто перерисовывать
я использовал следующий код

Код

procedure copyimage(var inbitmap:tbitmap;foncolor:string;xpos,ypos:integer);
var x,y:integer;
begin
 for x:=1 to inbitmap.Width-1 do
 begin
  for y:=1 to inbitmap.Height-1 do
  begin
  if inbitmap.Canvas.Pixels[x,y]<>stringtocolor(foncolor) then form1.Canvas.Pixels[x+xpos,y+ypos]:=inbitmap.Canvas.Pixels[x,y];
  end;
 end;
end;


но изображение сильно мерцает(рисунок не маленький)
может кто подскажет как сделать так что бы изображение не мерцало?????

Автор: Ozzя 21.2.2006, 15:56
Зачем через pixels? Код нижеприведенный легко переделывается для копирования
Код

Как нарисовать Bitmap с прозрачностью 
     
  

procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap;  
                             clTransparent: TColor);  
var  
  bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;  
  oldcol: Longint;  
begin  
  try  
    bmpAND := TBitmap.Create;  
    bmpAND.Width := Bmp.Width;  
    bmpAND.Height := Bmp.Height;  
    bmpAND.Monochrome := True;  
    oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));  
    BitBlt(bmpAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle,  
           0,0, SRCCOPY);  
    SetBkColor(Bmp.Canvas.Handle, oldcol);  

    bmpINVAND := TBitmap.Create;  
    bmpINVAND.Width := Bmp.Width;  
    bmpINVAND.Height := Bmp.Height;  
    bmpINVAND.Monochrome := True;  
    BitBlt(bmpINVAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,  
           bmpAND.Canvas.Handle, 0,0, NOTSRCCOPY);  

    bmpXOR := TBitmap.Create;  
    bmpXOR.Width := Bmp.Width;  
    bmpXOR.Height := Bmp.Height;  
    BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle,  
           0,0, SRCCOPY);  
    BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,  
           bmpINVAND.Canvas.Handle, 0,0, SRCAND);  

    bmpTarget := TBitmap.Create;  
    bmpTarget.Width := Bmp.Width;  
    bmpTarget.Height := Bmp.Height;  
    BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Cnv.Handle, x,y,  
           SRCCOPY);  
    BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,  
           bmpAND.Canvas.Handle, 0,0, SRCAND);  
    BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,  
           bmpXOR.Canvas.Handle, 0,0, SRCINVERT);  
    BitBlt(Cnv.Handle, x,y,Bmp.Width,Bmp.Height, bmpTarget.Canvas.Handle, 0,0,  
           SRCCOPY);  
  finally  
    bmpXOR.Free;  
    bmpAND.Free;  
    bmpINVAND.Free;  
    bmpTarget.Free;  
  end;  
end; 
Взято из http://forum.sources.ru 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)