第2章 图形图像处理实例

实例38 JPG与BMP相互转换

    

JPG文件由于具有较高的压缩率和较好的图像质量,特别适合于在Internet上传输,所以得到了广泛的应用。本实例可以实现JPG文件和BMP文件之间的相互转换。

向窗体上添加一个TOpenPictureDialog组件、一个TSavePictureDialog组件、一个Image控件和两个Button控件。设计完成的主界面如图2-36所示。

2-36  主界面

程序首先在uses段中加入jpeg单元。然后定义了两个全局对象(TBitmap类型的BitFileTJPEGImage类型的JpgFile)和一个全局变量(AnsiString类型的ImageFile)。其中BitFileJpgFile对象分别用于存储BMP文件和JPG文件的内容,而ImageFile变量用于存储程序打开的图像文件路径和文件名。

BMP文件转换为JPG文件是由一个自定义过程BmpToJpg来完成的,它有两个参数:一个是源文件名,一个是目标文件名。响应代码如下:

procedure TForm1.BmpToJpg(SrcFileName,DestFileName:AnsiString);

begin

    JpgFile:=TJPEGImage.Create();

    BitFile:=TBitmap.Create();

    try

        BitFile.LoadFromFile(SrcFileName);

        JpgFile.Width:=BitFile.Width;

        JpgFile.Height:=BitFile.Height;

        JpgFile.Assign(BitFile);

        JpgFile.SaveToFile(DestFileName);

     finally

        BitFile.Free;

        JpgFile.Free;

     end;

end;

如果用户打开了一个BMP文件,那么就可以通过单击“转换”按钮来转存为JPG文件,指定了源文件名和目标文件名后,就会调用BmpToJpg过程。

程序首先会创建JpgFileBitFile对象,并且把SrcFileName参数所表示的BMP文件读取到BitFile对象中。然后设置JpgFile对象的高度和宽度,同时通过JpgFile对象的Assign方法把BitFile中的内容读取到JpgFile中。最后通过调用JpgFile对象的SaveToFile方法转存文件。

JPG文件转换为BMP文件是由一个自定义过程JpgToBmp来完成的,它的原理和BmpToJpg过程基本一致,请读者参看源程序自己添加。

程序代码如下:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtDlgs, StdCtrls, ExtCtrls, jpeg;

type

  TForm1 = class(TForm)

    Image1: TImage;

    btnOpen: TButton;

    btnSave: TButton;

    OpenPictureDialog1: TOpenPictureDialog;

    SavePictureDialog1: TSavePictureDialog;

    procedure BmpToJpg(SrcFileName,DestFileName:AnsiString);

    procedure JpgToBmp(SrcFileName,DestFileName:AnsiString);

    procedure btnOpenClick(Sender: TObject);

    procedure btnSaveClick(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  ImageFile:AnsiString;

  BitFile:TBitmap;

  JpgFile:TJPEGImage;

 

implementation

{$R *.dfm}

 

procedure TForm1.BmpToJpg(SrcFileName,DestFileName:AnsiString);

begin

    //Bmp格式的文件转换成为jpg格式

    JpgFile:=TJPEGImage.Create();

    BitFile:=TBitmap.Create();

    try

        BitFile.LoadFromFile(SrcFileName);

        JpgFile.Width:=BitFile.Width;

        JpgFile.Height:=BitFile.Height;

        JpgFile.Assign(BitFile);

        JpgFile.SaveToFile(DestFileName);

     finally

        BitFile.Free;

        JpgFile.Free;

     end;

end;

 

procedure TForm1.JpgToBmp(SrcFileName,DestFileName:AnsiString);

begin

    //jpg格式的文件转换成为Bmp格式

    JpgFile:=TJPEGImage.Create();

    BitFile:=TBitmap.Create();

    try

        JpgFile.LoadFromFile(SrcFileName);

        BitFile.Width:=JpgFile.Width;

        BitFile.Height:=JpgFile.Height;

        BitFile.Assign(JpgFile);

        BitFile.SaveToFile(DestFileName);

     finally

        BitFile.Free;

        JpgFile.Free;

     end;

end;

procedure TForm1.btnOpenClick(Sender: TObject);

begin

    if self.OpenPictureDialog1.Execute then

    begin

        ImageFile:=self.OpenPictureDialog1.FileName;

        Image1.Picture.LoadFromFile(ImageFile);

    end;

end;

 

procedure TForm1.btnSaveClick(Sender: TObject);

begin

    if self.SavePictureDialog1.Execute then

    begin

        if LowerCase(ExtractFileExt(ImageFile))='bmp' then

        begin

            BmpToJpg(ImageFile,self.SavePictureDialog1.FileName);

        end

        else if LowerCase(ExtractFileExt(ImageFile))='jpg' then

        begin

            JpgToBmp(ImageFile,self.SavePictureDialog1.FileName);

        end;

    end;

end;

end.

保存文件,然后按F9键运行程序。在程序运行过程中,单击“打开”按钮,程序就会激活一个提示用户选择BMPJPG文件的对话框。确认选择后,程序就会显示这个图像文件,如图2-37所示。

2-37  显示图像文件

单击“转换”按钮,程序就会自动根据源文件选择将要转换的类型,如果读者选择的是BMP文件,程序就会自动将它转换为JPG文件,反之如果读者选择的是JPG文件,程序就会自动将它转换为BMP文件。

读者根据本实例介绍的原理,可以很轻松地完成诸如WMF文件与BMP文件的转换等很多图像转换功能。