在Image上画矩形,类似photoshop功能 我想说的是画矩形图我已经实现,但是当有窗口或者其它的东西盖住之后就会被擦掉,请问这个问题怎么解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Image1MouseMove Image1MouseDown Image1MouseUp在Image1MouseDown 事件里画的 要下班了,没时间了,这里有个演示代码,你去看一下:http://rabbitfox.blog.sohu.com/50812083.html 被其它窗口盖住,再显出来会产生WM_PAINT事件,Image被重画,你必须继承Image写一个你自己的Image,并且覆盖Paint方法.或者用TPaintBox,将画矩形的语句写在OnPaint事件中 先画在一个TBitmap里,在onpaint里把bitmap画在image里 1. 画图控件用 TPaintBox。2. 你得记住这个矩形对象,在PaintBox的OnPaint事件中画出该矩形。 试过3楼的例子, 写的不错但是有个小问题, 如果我把 Image的Stretch属性设为true的时候(因为我想实现图片缩放再裁剪), 画矩形 就不稳定了.请问这是什么原因?因为我之前是在Form1窗体上画的就不会有这问题,但是就会被别的窗体或者拖到屏幕的边上就会被擦掉, 我想实现 图片缩放,然后再可以画矩形,再裁剪.能不能实现? 那需要换算。其实你自己已经可以试着改一下了。动手写代码解决小问题可以提高自己的编程水平。另外,再参考这个例子:http://hi.baidu.com/382943850/blog/item/2fb06708eb4d19d463d986ee.html 再问一下, 在Form窗体上画的 图像能不能保存的?怎么保存? Form.Canvas可以CopyRect的很想帮你,但无奈啊今天又喝醉了,写不了。自己不可以研究一下吗?劝你还是要自己研究一下这种简单问题。 我研究了一早上了, 到网上什么例子都试过,但是就是不能解决 把Stretch属性设为true后 再画矩形 的时候让 鼠标的位置 和实际在图像的位置在同一个点上.由于之前没学过delphi,我是搞JAVA的,用delphi只做过一个简单的管理系统,像图像处理的我从来没接触过. 在图片不同的位置它的 X,Y 坐标的比例是不一样, 如果它好像是从左上角到右下角 在慢慢地 扩大X,Y坐标的比例 to 楼主:那你再研究一下这个代码,刚刚给你改的。c:\test.bmp是一个位图,尽量弄得长宽比大一些,以便测试。工程在主窗体上需要两个image,不要更改设置(在代码中已有你关心的设置)Image1是缩略图,鼠标操作就是在它上面进行Image2是原始尺寸,用于直观地看到缩略图位置与实际的对比你测试一下。尽管在Image1(缩略图)中看起来画的线有可能看不清(那是我技术处理还不到位,水平问题!酒的问题!),但大体上位置已经差不多了。思路就是这个思路!unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Image2: TImage; procedure Button1Click(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(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 BMP: TBitmap; Wdth, Hght : integer; CanSelect: Bool; rFrom: TRect;procedure TForm1.Button1Click(Sender: TObject);begin Self.Image1.AutoSize := False; Self.Image1.Stretch := True; Self.Image2.AutoSize := True; Self.Image2.Stretch := False; if not Assigned(BMP) then BMP := TBitmap.Create; BMP.LoadFromFile('c:\test.bmp'); Wdth := BMP.Width; Hght := BMP.Height; BMP.Canvas.Pen.Mode := pmNot; BMP.Canvas.Brush.Style := bsClear; Self.Image1.Picture.Bitmap.Assign(BMP); Self.Image2.Picture.Bitmap.Assign(BMP); rFrom := Rect(0, 0, 0, 0);end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin if Button = mbLeft then begin CanSelect := True; if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then BMP.Canvas.Rectangle(rFrom); rFrom.Left := Round(X * Wdth / Image1.Width); rFrom.Top := Round(Y * Hght / Image1.Height); rFrom.Right := Round(X * Wdth / Image1.Width); rFrom.Bottom := Round(Y * Hght / Image1.Height); end; Self.Image1.Picture.Bitmap.Assign(BMP); Self.Image2.Picture.Bitmap.Assign(BMP);end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin CanSelect := False;end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin if CanSelect then begin BMP.Canvas.Rectangle(rFrom); rFrom.Right := Round(X * Wdth / Image1.Width); rFrom.Bottom := Round(Y * Hght / Image1.Height); BMP.Canvas.Rectangle(rFrom); end; Self.Image1.Picture.Bitmap.Assign(BMP); Self.Image2.Picture.Bitmap.Assign(BMP);end;end. 我是这样解决的, 应该可行吧//这是放大图片procedure TForm1.Button2Click(Sender: TObject);beginImage1.ClientWidth:=Image1.ClientWidth+100;Image1.ClientHeight:=Image1.ClientHeight+100;BMP.Canvas.Rectangle(rFrom);BMP.Canvas.pen.width:=round(1200/Image1.ClientWidth);BMP.Canvas.Rectangle(rFrom);Self.Image1.Picture.Bitmap.Assign(BMP);end; 查最小日期和时间 请问一下有免费的分割mp3的命令行程序吗?或者分割的代码也可以 关于stringgrid中鼠标的判断请高手指教 如何指定tquery中的某一行? 各位程序員早呀!我有一個問题要請教妳们!多謝! 请问接收用户录用用什么函数? 那里有VFW的帮助文件啊?(delphi的)UP有分. 请教delphi里面创建help的方法 setsystemtime???????? 高手们,讨论,讨论!指点,指点! 有数据表A,B 有相关字段FIELD1....... 求助最简单的DELPHI 登入窗口 最后确认一下选择delphi的正确性
在Image1MouseDown 事件里画的
或者用TPaintBox,将画矩形的语句写在OnPaint事件中
2. 你得记住这个矩形对象,在PaintBox的OnPaint事件中画出该矩形。
但是有个小问题, 如果我把 Image的Stretch属性设为true的时候(因为我想实现图片缩放再裁剪), 画矩形 就不稳定了.请问这是什么原因?
因为我之前是在Form1窗体上画的就不会有这问题,但是就会被别的窗体或者拖到屏幕的边上就会被擦掉,
我想实现 图片缩放,然后再可以画矩形,再裁剪.能不能实现?
那需要换算。其实你自己已经可以试着改一下了。动手写代码解决小问题可以提高自己的编程水平。另外,再参考这个例子:http://hi.baidu.com/382943850/blog/item/2fb06708eb4d19d463d986ee.html
Form.Canvas可以CopyRect的
很想帮你,但无奈啊今天又喝醉了,写不了。自己不可以研究一下吗?劝你还是要自己研究一下这种简单问题。
由于之前没学过delphi,我是搞JAVA的,
用delphi只做过一个简单的管理系统,像图像处理的我从来没接触过.
工程在主窗体上需要两个image,不要更改设置(在代码中已有你关心的设置)Image1是缩略图,鼠标操作就是在它上面进行
Image2是原始尺寸,用于直观地看到缩略图位置与实际的对比你测试一下。尽管在Image1(缩略图)中看起来画的线有可能看不清(那是我技术处理还不到位,水平问题!酒的问题!),但大体上位置已经差不多了。思路就是这个思路!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(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
BMP: TBitmap;
Wdth, Hght : integer;
CanSelect: Bool;
rFrom: TRect;procedure TForm1.Button1Click(Sender: TObject);
begin
Self.Image1.AutoSize := False;
Self.Image1.Stretch := True;
Self.Image2.AutoSize := True;
Self.Image2.Stretch := False;
if not Assigned(BMP) then BMP := TBitmap.Create;
BMP.LoadFromFile('c:\test.bmp');
Wdth := BMP.Width;
Hght := BMP.Height;
BMP.Canvas.Pen.Mode := pmNot;
BMP.Canvas.Brush.Style := bsClear;
Self.Image1.Picture.Bitmap.Assign(BMP);
Self.Image2.Picture.Bitmap.Assign(BMP);
rFrom := Rect(0, 0, 0, 0);
end;procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
CanSelect := True;
if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then
BMP.Canvas.Rectangle(rFrom);
rFrom.Left := Round(X * Wdth / Image1.Width);
rFrom.Top := Round(Y * Hght / Image1.Height);
rFrom.Right := Round(X * Wdth / Image1.Width);
rFrom.Bottom := Round(Y * Hght / Image1.Height);
end;
Self.Image1.Picture.Bitmap.Assign(BMP);
Self.Image2.Picture.Bitmap.Assign(BMP);
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CanSelect := False;
end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if CanSelect then begin
BMP.Canvas.Rectangle(rFrom);
rFrom.Right := Round(X * Wdth / Image1.Width);
rFrom.Bottom := Round(Y * Hght / Image1.Height);
BMP.Canvas.Rectangle(rFrom);
end;
Self.Image1.Picture.Bitmap.Assign(BMP);
Self.Image2.Picture.Bitmap.Assign(BMP);
end;end.
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.ClientWidth:=Image1.ClientWidth+100;
Image1.ClientHeight:=Image1.ClientHeight+100;BMP.Canvas.Rectangle(rFrom);
BMP.Canvas.pen.width:=round(1200/Image1.ClientWidth);
BMP.Canvas.Rectangle(rFrom);
Self.Image1.Picture.Bitmap.Assign(BMP);
end;