想让 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; 但我试过没有改善,请问各位大侠这两个问题怎么解决?人在,解决问题即结帐
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; 但我试过没有改善,请问各位大侠这两个问题怎么解决?人在,解决问题即结帐
你把panel放在一个大的panel里,设置panel的border为不可见,然后设置 Panel1.DoubleBuffered := True;
此时移动,不会闪。
但是没太明白你意思,我把Image设置成透明,也没有问题呀。
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.
我试过了另一个方法:
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);这个可以实现。不过翻转后的图片跟原来的图片叠在一起了
怎么把原来那个图片先弄掉呢 ?
我试过了另一个方法:
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);这个可以实现。不过翻转后的图片跟原来的图片叠在一起了
怎么把原来那个图片先弄掉呢 ?
Image1.Graphic.Picture := nil;