《Delphi7图片格式转换》由会员分享,可在线阅读,更多相关《Delphi7图片格式转换(7页珍藏版)》请在金锄头文库上搜索。
1、Delphi7 图片格式转换例程本例将制作一个应用程序,用来转换图片的格式,运行界面如图:图 1点击“打开图像”按钮,可以从弹出的对话框中选择合适的图像打开。如果打开的图像是 bmp 格式的图片,点击 “BMP 转灰度”按钮,可以将原来彩色的 BMP 图像转换成灰色度的图像,并弹出保存对话框,以便保存转换后的图像。如图 2 所示。点击“BmpToJpeg”按钮,将 BMP 格式转换成 JPG 格式,同时弹出保存对话框,保存转换后的图像。如果打开的图像是 JPG 格式的图片, “BMP 转灰度”按钮 和“BmpToJpeg ”按钮无效。点击“JpegToBmp”按钮,将 JPG 格式转换成 BM
2、P 格式,同时弹出保存对话框,保存转换后的图像。点击“退出程序”按钮,关闭此应用程序。设计思想本例用到的控件主要是 Image 控件,Panel 控件,OpenPictureDialog 控件,SavePictureDialog 控件,Button 控件,Label 控件等。BMP 格式是 Windows 系统中标准的图像文件格式,具有极强的通用性。但其突出的缺点是文件过于庞大。目前 Jpg 格式的图片得到了广泛的应用,它的大小仅为 BMP 格式文件的 1/10 左右,而且图像品质并没有明显的损失。在许多情况下,我们需要在 BMP 和JPG 两种图像格式之间进行转换。图 2 BMP 转灰度后的
3、图像BMP 格式的图像是由像素组成的,一副彩色的图像包含了许多个像素点,每个像素都包含了三原色 R,G,B。如果将单一的灰色赋值给彩色图像的各个像素,彩色图像就变成了灰色的黑白图像。本程序主要分为以下几个步骤实现:(1) 、在窗口上放置各个控件,并设置它们的属性;(2) 、实现打开图像的功能,利用 OpenPictureDialog 控件的相关事件来实现;(3) 、实现彩色 bmp 格式的图像转换成黑白图像,需要自定义相关函数实现;(4) 、实现 BMP 与 JPG 两中格式之间的转换是最关键的问题。打开图像文件后,针对图像的不同格式进行相关事件的响应,需要用到 LowerCase(s) ,E
4、xtractFileExt()等相关函数。在打开图像文件后对文件的后缀名进行检查,针对不同的格式进行相应的处理。(5) 、保存转换后的图像利用 SavePictureDialog 控件的相关事件来实现。还有几个地方需要注意:首先添加Panel控件,调整其合适的大小及位置。在属性面板设置BevelInner 和BevelOuter 属性均为 “bvLowered”,BorderStyle 属性为“bsSingle”,BevelWidth 和BorderWidth 均为1,这样Panel 控件看起来具有立体感。其次,在窗体中Panel1 控件上添加Image 控件,在“属性”面板中用鼠标点击Pic
5、ture属性右边的按钮,从弹出的对话框中选择合适的图像文件导入,用来设置应用程序开始运行时界面上的图像。如图1中的美女图片,就是在Picture属性里导入的。设置其Align属性为“alClient”,Stretch 属性为 “True”,使图像撑满整个Panel1 控件。最后,在窗体上添加OpenPictureDialog 控件和SavePictureDialog 控件。在“ 属性” 面板中设置OpenPictureDialog 控件的Options 属性为“ofHideReadOnly,ofEnableSizing”,Filter属性为“All (*.jpg;*.jpeg;*.bmp;*.
6、ico;*.emf;*.wmf)”,SavePictureDialog 控件属性的设置与OpenPictureDialog 控件类似。Filter属性设置如图:图 3 Filter 属性设置添加完控件后的窗体如图所示:图 4 添加完控件后的窗体程序源代码:unit BmpToJpeg;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ExtCtrls, ExtDlgs, StdCtrls , JPEG;/此处注意添加 JPGE;typeTForm1 =
7、class(TForm)Panel1: TPanel;Image1: TImage;OpenPictureDialog1: TOpenPictureDialog;SavePictureDialog1: TSavePictureDialog;Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;Button5: TButton;Label1: TLabel;procedure Button2Click(Sender: TObject);procedure Button5Click(Sender: TObject);
8、procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button4Click(Sender: TObject);procedure Button3Click(Sender: TObject);private Private declarations public Public declarations end;varForm1: TForm1;BitFile:TBitmap;JpgFile:TJpegImage;implementation$R *.dfm/定义彩色图像转
9、换为灰度图像的过程procedure ConvertGray(Cnt:TCanvas); /TCanvas 画布对象varx,y:integer;/color:LongInt; /说明:定义彩色图像转换为灰度图像的过程,我用/了两种方法,这两种方法都是可以的。主要是求/R,G,B 的值,一种方法使用了 shr 右移运算法,另/一种方法使用 GetRvalue()函数来获取 R,G,B 的值R,G,B,Gr:Byte;beginwith Cnt do /记录类型,记录域的访问/Cliprect 属性:可以确定一个裁剪区域的边界。使用 ClipRect 可以限制画布/上的绘图区域,任何超过该区域的
10、图形将被裁剪,不会出现在画布上。for x:=Cliprect.Left to Cliprect.Right do /从图像左边到右边执行转换for y:=Cliprect.Top to Cliprect.Bottom do /从图像顶部对底部执行转换begin/color:=ColorToRGB(Pixelsx,y); /将每一像素的 R,G,B 值存储在长整数中/B:=(Color and $FF0000)shr 16; /分解这个长整数得到 R,G,B 的值/G:=(Color and $FF00) shr 8 ; /SHR:右移运算符/R:=(Color and $FF);R:=Get
11、Rvalue(ColorToRGB(Pixelsx,y); /获取 R,G,B 的值G:=GetGvalue(ColorToRGB(Pixelsx,y);B:=GetBvalue(ColorToRGB(Pixelsx,y);Gr:=HiByte(R*77+G*151+B*28);Pixelsx,y:=RGB(Gr,Gr,Gr); /将灰度赋给相应的像素end;end;function RGB(R,G,B:Byte):TColor; /定义颜色转换的函数beginResult:=B shl 16 or G shl 8 or R; /位运算符,or 按位或,shl 左移end;/TScreen 类
12、封装了有关应用程序运行时屏幕的状态信息。TScreen 即不能作为组件加到窗体/上,也不能运行时动态的创建它。Delphi7 会自动创建一个 TScreen 类型的全局变量,名为/Screen.procedure TForm1.Button2Click(Sender: TObject); /彩色图像转换成灰度图像begin Screen.Cursor:=crHourGlass; /Cursor 属性用于设置整个应用程序的光标形状。/运行时光标为漏洞形状ConvertGray(Image1.Picture.Bitmap.Canvas);Screen.Cursor:=crDefault; /默认光
13、标为箭头形状form1.SavePictureDialog1.DefaultExt:=jpg; /设置缺省文件扩展名if form1.SavePictureDialog1.Execute thenimage1.Picture.SaveToFile(Form1.SavePictureDialog1.FileName); /存储图像文件form1.Button3.Enabled:=false; end;/目前存在的问题:Bmp 图像转成灰度图像后不能在转成 Jpeg 图像,如何解决?procedure TForm1.FormCreate(Sender: TObject);beginform1.Op
14、enPictureDialog1.Title:=请选择一个图像文件打开(*.bmp 或 *.jpg);/form1.OpenPictureDialog1.InitialDir:=H:小毛文件S-Cute; /打开对话框默认的位置form1.SavePictureDialog1.Title:=保存转换后的图像文件 ;/form1.SavePictureDialog1.InitialDir:=H:小毛文件S-Cute; /保存对话框默认的保存文/件的位置button3.Enabled:=false;button4.Enabled:=false;end;procedure TForm1.Button
15、1Click(Sender: TObject); /打开图像beginform1.OpenPictureDialog1.Title:=请选择一个图像文件打开(*.bmp 或 *.jpg);/form1.OpenPictureDialog1.InitialDir:=H:小毛文件S-Cute;if form1.OpenPictureDialog1.Execute thenform1.Image1.Picture.LoadFromFile(form1.OpenPictureDialog1.FileName);/导入图像文件if LowerCase(ExtractFileExt(form1.OpenPictureDialog1.FileName)=.jpg thenbeginform1.Button4.Enabled:=true; /激活 JpegToBmp 按钮form1.Button3.Enabled:=false;form1.Button2.Enabled:=false;endelse/LowerCase(s)将字符串 s 中的大写字母全部转换为小写字母并返回/ExtractFileExt()获取后缀名 ExtractFileName()获取