想让 Image1里的图像翻转,在网上看到一段代码
Procedure Flip1Click(Sender: TObject);Var
   DummyImage          : TImage;
   X,Y                 : Integer;
   SrcRect,DstRect     : TRect;Begin
  //Assumes that Image1 holds the picture to be flipped
  X := Image1.Picture.Width;
  Y := Image1.Picture.Height;
  SrcRect := Rect(0,0,X,Y);
  DstRect := Rect(X,0,0,Y);
  //This is the trick!
  DummyImage := TImage.Create(Self);
  DummyImage.Width := X;
  DummyImage.Height := Y;
  //DummyImage.Canvas.CopyMode := cmSrcCopy
  DummyImage.Canvas.CopyRect(DstRect,Image1.Canvas,SrcRect);
  //Flipping the image
  Image1.Picture := DummyImage.Picture;
  //Copy the flipped image to Image1
  DummyImage.Free;
end;
结果是能让图像翻转,但是我的图像是透明的,也就是Transparent 属性为TRUE.翻转后周边那些颜色变成过滤不了了,再次Image1.Transparent:=true; 也没效果,谁给解释下这问题怎么解决?另一个是关于如何拖动一副图片,我是这么做的:
在鼠标按下时:
   IDrag:=true;
   ox:=X;
   oy:=Y;
拖动时:
   if IDrag then
   begin
     Image1.Left := Image1.Left + X - ox;
     Image1.Top := Image1.Top + Y - oy;
鼠标放开时:
   IDrag:=false;
问题是能实现拖动,但是拖动的时候图片跳动得很厉害,甚至有时候会莫名其妙跳到别处,有人说用DoubleBuffered:= true; 但我试过没有改善,请问各位大侠这两个问题怎么解决?人在,解决问题即结帐

解决方案 »

  1.   

    问题二:
    你把panel放在一个大的panel里,设置panel的border为不可见,然后设置  Panel1.DoubleBuffered := True;
    此时移动,不会闪。
      

  2.   

    问题一:你这是水平翻转。
    但是没太明白你意思,我把Image设置成透明,也没有问题呀。
      

  3.   

    就是有一个矩形的图像,中间有个人周围用某个相同颜色填充,将次Image1.Transparent:=true; 后就只看到人了,周围的颜色被过滤掉,但是翻转后周边那些本应过滤掉的颜色又有了
      

  4.   

    是啊  Bitmap 格式的
      

  5.   

    哦,我给你写了个算法,你自己试试:)unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, jpeg;type
      TForm1 = class(TForm)
        Image1: TImage;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}var
      old_x, old_y: integer;procedure foo(var data1, data2: array of byte; height, width: integer; bitcount: integer; flag: byte);
    var
      i, j, k: integer;
    begin
      case flag of
        0: //垂直
        begin
          for i:=0 to height-1 do
            for j:=0 to width-1 do
              for k:=0 to bitcount div 8 do
              begin
                data2[(i*width+j)*bitcount div 8+k]:=data1[((height-1-i)*width+j)*bitcount div 8+k];
              end;
        end;
        1: //水平
        begin
          for i:=0 to height-1 do
            for j:=0 to width-1 do
              for k:=0 to bitcount div 8 do
              begin
                data2[(i*width+j)*bitcount div 8+k]:=data1[(i*width+(width-1-j))*bitcount div 8+k];
              end;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      stream: TMemoryStream;
      data1, data2: array of byte;
      bmpinfo: TBitmapInfo;
      buf: pointer;
    begin
      stream:=TMemoryStream.Create;
      Image1.Picture.Bitmap.SaveToStream(stream);
      setlength(data1, stream.size-54);
      setlength(data2, stream.size-54);
      stream.Position:=14;
      stream.ReadBuffer(bmpinfo.bmiHeader, 40);
      stream.ReadBuffer(data1[0], bmpinfo.bmiHeader.biSizeImage);
      //foo(data1[0], data2[0], bmpinfo.bmiHeader.biHeight, bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biBitCount, 0);
      foo(data1[0], data2[0], bmpinfo.bmiHeader.biHeight, bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biBitCount, 1);
      Image1.Canvas.Lock;
      try
        Image1.Picture.Bitmap.Handle:=CreateDIBSection(0, BMPInfo, DIB_RGB_COLORS, buf, 0, 0);
        if buf <> nil then
          Move(data2[0], buf^, bmpinfo.bmiHeader.biSizeImage);
      finally
        Image1.Canvas.Unlock;
      end;
      stream.Free;
    end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      old_x:=X;
      old_y:=Y;
    end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        Image1.Left:=Image1.Left+(X-old_x);
        Image1.Top:=Image1.Top+(Y-old_y);
      end;
    end;end.
      

  6.   

    直接把内存里面的象素翻过来,我测试了一张普通的bmp图,不过不知道对你那张经过特殊处理的图还有没有效果!
      

  7.   

    我试过了好像不行, 翻转后的图像变成一团漆黑,虽然大概能看清除原来的形状
    我试过了另一个方法:
      Image1.Repaint;
      for i:= 0 to Image1.width do
      begin
        with rect1 do
        begin
          left:=i;
          top:=0;
          right:=i+1;
          bottom:=Image1.height;
        end;
        with rect2 do
        begin
          left:=(Image1.width)-i-1;
          top:=0;
          right:=(Image1.width)-i;
          bottom:=Image1.height;
        end;
        Image1.canvas.copyrect(rect2,Image1.canvas,rect1);这个可以实现。不过翻转后的图片跟原来的图片叠在一起了 
    怎么把原来那个图片先弄掉呢 ?
      

  8.   

    我试过了好像不行, 翻转后的图像变成一团漆黑,虽然大概能看清除原来的形状
    我试过了另一个方法:
      Image1.Repaint;
      for i:= 0 to Image1.width do
      begin
        with rect1 do
        begin
          left:=i;
          top:=0;
          right:=i+1;
          bottom:=Image1.height;
        end;
        with rect2 do
        begin
          left:=(Image1.width)-i-1;
          top:=0;
          right:=(Image1.width)-i;
          bottom:=Image1.height;
        end;
        Image1.canvas.copyrect(rect2,Image1.canvas,rect1);这个可以实现。不过翻转后的图片跟原来的图片叠在一起了 
    怎么把原来那个图片先弄掉呢 ?
      

  9.   

    将原来的图片弄掉:
    Image1.Graphic.Picture := nil;