请问问关于IMAGE控件的使用问题。150分求购解答方法。最好详细一点。谢谢!(150分)

  • 主题发起人 主题发起人 godai01
  • 开始时间 开始时间
G

godai01

Unregistered / Unconfirmed
GUEST, unregistred user!
1、在image控件里显示一张图片,但当图片的尺寸大于IMAGE控件
显示尺寸的时候,只能看到图片和的一部分,而设置拉伸属性只
能按IMAGE控件的尺寸显示,比如说图片是1024*768,控件尺寸为
400*400,图片就只能变成400*400显示,但不能按图片的原尺寸按
比例缩小显示,即400*300格式显示,请问如何设置才能做到按比
例缩小并居中显示呢?
2、另外,在IMAGE里显示的图片是否也会编译到EXE文中的,但我
想在运行的时候才载入,如何做比较好?
 
1. stretch:=true;

2.将image资源编译进dll中,在程序中动态调用
 
1. 先创建一TBitmap,将图片读如,再根据这个TBitMap的Width和Heigth属性设置Image
的Width和Heigth属性,并将stretch设为True
2. 将image资源编译进dll中,在程序中动态调用
 
1、图片的实际大小可以从 Image.Picutre.Height(Width)中读出(帮助中是这么说的,具体
没试),然后再相应地调整 Image 的大小和 Stretch 属性。
2、Image.Picture.LoadFromFile('c:/My.bmp');
 
这段代码是在Delphi 5+Win98下调试的,你需要在一个窗体上放一个TImage,一个TButton
和一个TOpenPictureDialog。
procedure TForm1.Button1Click(Sender: TObject);
var bmp1: TBitmap;
sp: Double;
begin
if OpenPictureDialog1.Execute then
begin
bmp1 := TBitmap.Create;
bmp1.LoadFromFile(OpenPictureDialog1.FileName);
sp := bmp1.Height/bmp1.Width;
with Image1 do
begin
Refresh;
if bmp1.Width>=bmp1.Height then
Canvas.CopyRect(Rect(0,0,Width,Round(Width*sp)), bmp1.Canvas,
Rect(0,0,bmp1.Width, bmp1.Height))
else
Canvas.CopyRect(Rect(0,0,Round(Height/sp),Height), bmp1.Canvas,
Rect(0,0,bmp1.Width, bmp1.Height))
end;
bmp1.Free;
end;
end;
还有待改进,你先参考一下,待我慢慢求精。
 
问题1 :你应该设置Imagede的AutoSize属性为True!
问题2 :Image.Picture.Bitmap.LoadFromFile('图片路径');
 
to 卷起千堆雪tyn
如果按你这么设置,那么本来是长方形的图片显示出来就是正方形的啊?
 
to godai01 :
兄弟!设置Image的AutoSize为True,你认真看看!
这时的Image的大小就是图片的大小!!!
 
大功告成!我相信这就是你想要的:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Jpeg, ExtDlgs;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
OpenPictureDialog1: TOpenPictureDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
DrawRect: TRect;
FPicture: TPicture;
begin
if OpenPictureDialog1.Execute then
begin
FPicture := TPicture.Create;
FPicture.LoadFromFile(OpenPictureDialog1.FileName);
with Image1 do
begin
Canvas.Brush.Color := Color;
DrawRect := ClientRect;
Canvas.FillRect(DrawRect);
if FPicture.Width > 0 then
begin
with DrawRect do
if (FPicture.Width > Right - Left) or (FPicture.Height > Bottom - Top) then
begin
if FPicture.Width > FPicture.Height then
Bottom := Top + MulDiv(FPicture.Height, Right - Left, FPicture.Width)
else
Right := Left + MulDiv(FPicture.Width, Bottom - Top, FPicture.Height);
Canvas.StretchDraw(DrawRect, FPicture.Graphic);
end
else
with DrawRect do
Canvas.Draw(Left + (Right - Left - FPicture.Width) div 2, Top + (Bottom - Top -
FPicture.Height) div 2, FPicture.Graphic);
end;
end;
FPicture.Free;
end;
end;

end.
 
将stretch和将AutoSize设为true是不一样的,前者是使图象自动伸缩以便适合image控件
也就是当图象大于image控件大小时图象会自动缩小,使得图象能全部在iamge中显示
但将autosize设为true 的话,就是iamge会自动随着图片的大小伸缩,这就看你的需要了。
另外用Image.Picture.Bitmap.LoadFromFile('图片路径');是不会将图象编译到程序中去的
除非你将你的图片作成资源文件,编译时delphi才会将图片编译到exe文件中去
 
下列代码绝对可以解决问题1:
Image1.Strech:=True;
if OpenPictureDialog1.Execute then
Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Picture.Assign(Image2.Picture);
问题2:
如果是在设计时给Image1.Picture添加的图片,则它被作为资源编译到EXE文件中;
在运行的时候才载入可以按上述语句实现。
 
多人接受答案了。
 
后退
顶部