怎样实现 缩小图片(100分)

  • 主题发起人 主题发起人 taimoly
  • 开始时间 开始时间
T

taimoly

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样实现 缩小图片
怎样实现 缩小图片
怎样实现 缩小图片
 
Image控件里不是有一个Stretch属性吗?设置为True就可以呀。
 
调用画布的从新绘画,设置画布的大小即可
 
简单的可以这样做,首先读入原图的尺寸,然后根据你期望的尺寸,将TImage的尺寸按比例缩小,即改变TImage的width和height,当然了,TImage的Stretch属性要置为True,同时你可以调整TImage的Top和Left让图形显示在合适的位置上,这是基本思路,实现起来不困难的
 
to all 不是这样的。
我现在的问题是用savefile('....') 到一个图片文件,且这个文件的图片也被缩放了。
 
给你一个图片放大的实现原理,图片缩小一样。

本文介绍实现图象局部、平滑和无闪烁放大的算法原理,以及在Delphi中实现的技术。读完本文,您一定会为Delphi能用如此少的代码实现如此强大的功能惊叹不已,这是许多其它开发工具所无法比拟的。

算法原理

在Delphi中,可利用类Tcanvas的CopyRect方法实现图象的放大和缩小。其功能是将源画布上的一个指定矩形区域(简称源矩形)内的象素,拷贝到目的画布上的一个指定矩形区域(简称目的矩形)中。亦可称之为象素块复制,如图1所示。

由CopyMode属性确定拷贝的模式。在直接拷贝模式(cmSrcCopy)下,当源矩形与目的矩形相等时,图象不变;若源矩形大于目的矩形,图象则缩小;而当源矩形小于目的矩形时,图象便被放大(在目的矩形中扩展)。源矩形与目的矩形大小之比,决定图象的缩放倍数。CopyRect方法声明如下:

Procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: Trect);

其中参数,Dest为目的矩形,Canvas是源画布,Source为源矩形。

实现步骤

新建应用程序主目录C:/Magnifier及其子目录Images,将事先制作好的位图图象Picture.bmp存入Images目录。本例中,Picture.bmp的大小为260*310象素。

启动Delphi IDE,新建项目Magnifier.dpr,主窗体单元命名为Main.pas,存入C:/Magnifier目录。在主窗体上放置一个TPanel组件,并在其中加入两个TImage组件。两个TImage组件分别命名为ForeImage和BackImage,前者重叠于后者之上,并且都装入Picture.bmp位图。

主窗体和各组件的主要属性按表1设置:

表1 主窗体和各组件属性设置

组 件 属 性 设 置
Form1 BorderIcons.biMaximize False
BorderStyle bsNone
Color clRed
Height 364
KeyPreview True
Name MainForm
Position poScreenCenter
Width 294
WindowState wsNormal
Panel1 Align alNone
BevelInner bvLowered
BevelOuter bvRaised
BevelWidth 2
BorderStyle bsNone
BorderWidth 2
Height 322
Name FramePanel
Visible Ture
Width 272
Image1 Align alNone
AutoSize True
Center True
Height 310
Name BackImage
Picture Picture.bmp
Stretch False
Visible False
Width 260
Image2 Align alNone
AutoSize True
Center True
Height 310
Name ForeImage
Picture Picture.bmp
Stretch False
Visible True
Width 260

上述各组件的许多属性,读者亦可根据个人的爱好设定。在主单元Main.pas的implementation段声明常量和变量:

const

sSide=30; //改动这个数值和下面的dSide就可以了
dSide=45;

var
msHide: Boolean;
OldX, OldY, NewX, NewY: Integer;
DestRect, SourceRect : TRect;

其中,常量sSide和dSide用以控制“放大镜”的大小和放大倍数;变量msHide控制光标(鼠标)的隐藏和打开;其它变量用以确定放大部位。

建立主窗体MainForm的OnCreate事件,加入下列语句,以初始化变量及设置复制模式:
msHide:=True;
Canvas.CopyMode:=cmSrcCopy;
 
简单的做法,创建一副新的位图,设置新位图的高度和宽度,然后把原图片StretchBlt到
新的图片上 然后保存新的位图就可以了。
NewBitMap := TBitMap.Create;
//NewBitmap.PixelsFormat := pf24bit;
NewBitmap.Width := ratio * OriginalBitmap.height ;
NewBitmap.Width := ratio * OriginalBitmap.width ;

StretchBlt(NewBitmap.Canvas.Handle,0,0,NewBitmap.Width,NewBitmap.Width ,
OriginalBitmap.canvas.handle,0,0,OriginalBitmap.width,OriginalBitmap.height,
SRCCOPY );

NewBitMap.SaveToFile();

NewBitmap.Free;
 
后退
顶部