Исходный проект (Mattias Gaertner) содержится в папке Lazarus/examples (папка jpeg). Здесь представлена немного переработанная версия.
Программа просматривает графические файлы стандартных форматов (*.bmp;*.xpm;*.png;*.pbm;*.pgm;*.ppm;*.ico;*.icns; '*.cur;*.jpg;*.jpeg;*.jpe;*.jfif) (но не gif) а также сохранять картинки, преобразуя в формат jpeg.
При просмотре возможно масштабирование.
{ Copyright (C) 2004 Mattias Gaertner Example for loading and saving jpeg images. . . . . } {Winni, 03.2010 - незначительные, но полезные :-) добавки 1. Добавил FName := ExtractFileName(Filename); - укоротил имя файла 2. Вместо кнопок - меню и убрал GroupBox 3. Встроил включение/выключение св-в TImage: Stretch, Proportional 4. Image1.BorderSpacing.Around -> 20 // Лучше смотрится 5. Проект сделал заново, руководствуясь только .pas-текстом главного модуля. Теперь он не показывает консольное окно, которое почему-то было в исходном проекте. } unit unmain1; {$mode objfpc}{$H+} interface uses Classes, SysUtils,{ FileUtil,} LResources, Forms, Controls, Graphics, Dialogs, { StdCtrls,} ExtCtrls, ExtDlgs, Menus; type { TfrmMain2 } TfrmMain2 = class(TForm) Image1: TImage; MainMenu1: TMainMenu; MenuItem1: TMenuItem; MenuItem2: TMenuItem; proporcia: TMenuItem; multi: TMenuItem; PicName: TMenuItem; SaveAsJPEG: TMenuItem; SavePicture: TMenuItem; quit: TMenuItem; OpJPEG: TMenuItem; OpPicture: TMenuItem; OPD1: TOpenPictureDialog; SPD1: TSavePictureDialog; procedure multiClick(Sender: TObject); procedure OpJPEGClick(Sender: TObject); procedure OpPictureClick(Sender: TObject); procedure proporciaClick(Sender: TObject); procedure quitClick(Sender: TObject); procedure SaveAsJPEGClick(Sender: TObject); procedure SavePictureClick(Sender: TObject); private { private declarations } procedure UpdateInfo(const Filename: string); procedure Open1; public { public declarations } end; var frmMain2: TfrmMain2; implementation { TfrmMain2 } procedure TfrmMain2.Open1; begin OPD1.Options:=OPD1.Options+[ofFileMustExist]; OPD1.Filter:= 'Graphic (*.bmp;*.xpm;*.png;*.pbm;*.pgm;*.ppm;*.ico;*.icns;*.cur;*.jpg;'+ '*.jpeg;*.jpe;*.jfif)|*.bmp;*.xpm;*.png;*.pbm;*.pgm;*.ppm;*.ico;*.icns;'+ '*.cur;*.jpg;*.jpeg;*.jpe;*.jfif|Bitmaps (*.bmp)|*.bmp|'+ 'Pixmap (*.xpm)|*.xpm|Portable Network Graphic (*.png)|*.png|'+ 'Portable PixMap (*.pbm;*.pgm;*.ppm)|*.pbm;*.pgm;*.ppm|Icon (*.ico)|'+ '*.ico|OSX Icon Resource (*.icns)|*.icns|Cursor (*.cur)|*.cur|'+ 'Joint Picture Expert Group (*.jpg;*.jpeg;*.jpe;*.jfif)|'+ '*.jpg;*.jpeg;*.jpe;*.jfif|Все файлы (*.*)|*.*|'; end; procedure TfrmMain2.OpPictureClick(Sender: TObject); begin OPen1; if not OPD1.Execute then exit; try // Загружаем прямо в TImage. Тогда можно грузить любой регистрированный // формат прямо в TImage: .bmp, .xpm, .png - стандартные LCL форматы // Модуль jpeg регистрирует .jpeg и .jpg. Image1.Picture.LoadFromFile(OPD1.Filename); UpdateInfo(OPD1.Filename); except on E: Exception do begin MessageDlg('Ошибка','Ошибка: '+E.Message,mtError,[mbOk],0); end; end; end; procedure TfrmMain2.proporciaClick(Sender: TObject); begin Image1.Proportional:= not Image1.Proportional; if Image1.Proportional then proporcia.Caption:= 'Proportional (On) ' else proporcia.Caption:= 'Proportional (Off)'; end; procedure TfrmMain2.quitClick(Sender: TObject); begin Application.Terminate; end; procedure TfrmMain2.SaveAsJPEGClick(Sender: TObject); var JPEG: TJPEGImage; begin if Image1.Picture.Graphic=nil then begin MessageDlg('Нет картинки','Откройте картинку прежде сохранения',mtError, [mbOk],0); exit; end; SPD1.Options:=SPD1.Options+[ofPathMustExist]; if not SPD1.Execute then exit; try // Создаем JPEG и копируем картинку Image1.Picture.Graphic в него. // Затем JPEG сохраняет картинку в файле. Расширение игнорируется, // всегда сохраняет .jpeg JPEG:=TJPEGImage.Create; try // копируем картинку Image1.Picture.Graphic в JPEG JPEG.Assign(Image1.Picture.Graphic); // JPEG сохраняет картинку JPEG.SaveToFile(SPD1.Filename); finally JPEG.Free; end; UpdateInfo(SPD1.Filename); except on E: Exception do begin MessageDlg('Ошибка','Ошибка: '+E.Message,mtError,[mbOk],0); end; end; end; procedure TfrmMain2.SavePictureClick(Sender: TObject); begin // если нет картинки Image1.Picture.Graphic if Image1.Picture.Graphic=nil then begin MessageDlg('Нет картинки','Откройте картинку прежде сохранения',mtError, [mbOk],0); exit; end; SPD1.Options:=SPD1.Options+[ofPathMustExist]; if not SPD1.Execute then exit; try // Сохраняем прямо из TImage в файл. При этом сохранится любой // зарегистрированный формат. .bmp, .xpm, .png - стандартные LCL форматы // и .jpeg и .jpg. Image1.Picture.SaveToFile(SPD1.Filename); UpdateInfo(SPD1.Filename); except on E: Exception do begin MessageDlg('Ошибка','Ошибка: '+E.Message,mtError,[mbOk],0); end; end; end; procedure TfrmMain2.OpJPEGClick(Sender: TObject); var JPEG: TJPEGImage; begin OPD1.Options:=OPD1.Options+[ofFileMustExist]; OPD1.Filter:='JPEG|*.jpg;*.jpeg;*.jpe;*.jfif|'; if not OPD1.Execute then exit; try // Создаем TJPEGImage и загужаем файл, затем копируем в TImage. // TJPEGImage может загружать только jpeg - картинки. JPEG:=TJPEGImage.Create; try JPEG.LoadFromFile(OPD1.Filename); // копируем jpeg - content to a TImage Image1.Picture.Assign(JPEG); // похоже JPEG.GrayScale - readonly. finally JPEG.Free; end; UpdateInfo(OPD1.Filename); except on E: Exception do begin MessageDlg('Ошибка','Ошибка: '+E.Message,mtError,[mbOk],0); end; end; end; procedure TfrmMain2.multiClick(Sender: TObject); begin Image1.Stretch:= not Image1.Stretch; if Image1.Stretch then multi.Caption:= 'Stretch (On) ' else multi.Caption:= 'Stretch (Off)'; end; procedure TfrmMain2.UpdateInfo(const Filename: string); var Info,Fname: String; begin FName := ExtractFileName(Filename); if Image1.Picture.Graphic<>nil then begin Info:=Image1.Picture.Graphic.ClassName+':'+Fname; end else begin Info:=Fname; end; PicName.Caption:=' '+Info; end; initialization {$I unmain1.lrs} end.Скачать RAR-архив исходников + .exe (Pictures_Full.rar - 460 Кб)