Сохранение и загрузка любых изображений
Сохранение и загрузка любых изображений
Сохранение и загрузка любых изображений С использованием TImage для форматов bmp, jpg и gif я делал это так. Занесение изображения в TImage и в БД: procedure TfmMain.btnOpenClick(Sender: TObject); var S: TStream; begin if OpenDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenDialog1.FileName); ADODataSet1.Edit; S := ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('GRAPHIC'), bmWrite); try Image1.Picture.Graphic.SaveToStream(S); finally S.Free; ADODataSet1.Post; end; end; end; Здесь всё как и в статье с сайта Borland. Чтение из БД в TImage выглядит так: uses ..., JPEG, RxGIF; ... procedure TfmMain.ShowPicture; var S: TStream; Code: Word; begin //Процедура показывает изображение, а если его нет в базе, стирает TImage if Assigned(Image1.Picture.Graphic) then Image1.Picture := nil; if not ADODataSet1.FieldByName('GRAPHIC').IsNull then begin S := ADODataSet1.CreateBlobStream(ADODataSet1.FieldByName('GRAPHIC'), bmRead); try S.Read(Code, SizeOf(Code)); S.Seek(0, 0); case Code of $4D42: begin Image1.Picture.Graphic := TBitmap.Create; Image1.Picture.Graphic.LoadFromStream(S); end; $D8FF: begin Image1.Picture.Graphic := TJPEGImage.Create; Image1.Picture.Graphic.LoadFromStream(S); end; $4947: begin Image1.Picture.Graphic := TGIFImage.Create; Image1.Picture.Graphic.LoadFromStream(S); end; end; finally S.Free; end; end; end; А вот сохранение из БД в файл: procedure TfmMain.btnSaveClick(Sender: TObject); var S: TStream; FileS: TFileStream; Code: Word; begin //Процедура сохраняет изображение в файл в зависимости от его формата if not ADODataSet1.FieldByName('GRAPHIC').IsNull then begin S := pFIBDataSet1.CreateBlobStream(ADODataSet1.FieldByName('GRAPHIC'), bmRead); try S.Read(Code, SizeOf(Code)); S.Seek(0, 0); case Code of $4D42: begin SaveDialog1.Filter := 'Bitmap (*.bmp)|*.bmp'; SaveDialog1.DefaultExt := 'bmp'; end; $D8FF: begin SaveDialog1.Filter := 'Файл изображений JPEG (*.jpg)|*.jpg'; SaveDialog1.DefaultExt := 'jpg'; end; $4947: begin SaveDialog1.Filter := 'Изображение CompuServe GIF (*.gif)|*.gif'; SaveDialog1.DefaultExt := 'gif'; end; end; if SaveDialog1.Execute then if FileExists(SaveDialog1.FileName) then FileS := TFileStream.Create(SaveDialog1.FileName, fmOpenWrite) else FileS := TFileStream.Create(SaveDialog1.FileName, fmCreate); try FileS.CopyFrom(S, S.Size); finally FileS.Free; end; finally S.Free; end; end; end; Здесь для поддержки формата jpg использован стандартный модуль Delphi Jpeg, а для поддержки формата gif пришлось использовать библиотеку компонентов Rx (модуль RxGIF). Используя такой подход, можно вообще-то преобразовывать изображения в bmp и хранить их в БД в едином формате. Тогда надо определять формат изображения при загрузке его из файла, преобразовывать в bmp и потом сохранять в БД. Преобразовывать так: var J: TJPEGImage; ... Image1.Picture.Bitmap.Assign(J); Kraks