Delphi7 + SQL2000 处理image 问题.
程式 A (易助4.0 商品信息可加入图片小程式)
程式 B 自己写的delphi7 小程式
程式 C SQL Image Viewer
问题:
程式 A存的图, 用程式B看会出 error#53
程式 B存的图, 用程式A看会登出系
程式 C 可以看到 程式 A/B存的图.(没有储存功能)
程式 B还可以怎让改?
程式 B源码如下:
unit Main;
interface
uses
Variants,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, ABSMain, Jpeg,
ADODB;
type
TfrmMain = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
btSaveImage: TButton;
odBlob: TOpenDialog;
sdBlob: TSaveDialog;
btLoadImage: TButton;
GroupBox2: TGroupBox;
Photo: TImage;
ADOTable1: TADOTable;
procedure btLoadImageClick(Sender: TObject);
procedure btSaveImageClick(Sender: TObject);
procedure ADOTable1AfterScroll(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
//------------------------------------
procedure TfrmMain.btLoadImageClick(Sender: TObject);
var
FileStream: TFileStream;
BlobStream: TStream;
begin
if (odBlob.Execute) then
begin
ADOTable1.Edit;
try
BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('DEB002'),bmWrite);
FileStream := TFileStream.Create(odBlob.FileName,fmOpenRead or fmShareDenyNone);
BlobStream.CopyFrom(FileStream,FileStream.Size);
FileStream.Free;
BlobStream.Free;
ADOTable1.Post;
ADOTable1AfterScroll(ADOTable1);
except
ADOTable1.Cancel;
end;
end;
end;
procedure TfrmMain.btSaveImageClick(Sender: TObject);
var
FileStream: TFileStream;
BlobStream: TStream;
begin
if (sdBlob.Execute) then
begin
FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('DEB002'),bmRead);
FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
BlobStream.Free;
FileStream.Free;
end;
end;
procedure TfrmMain.ADOTable1AfterScroll(DataSet: TDataSet);
var
JpegImage: TJPEGImage;
BlobStream: TStream;
begin
if (not ADOTable1.FieldByName('DEB002').IsNull) then
begin
BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('DEB002'),bmRead);
JpegImage := TJPEGImage.Create;
try
JpegImage.LoadFromStream(BlobStream);
Photo.Picture.Assign(JpegImage);
Photo.Visible := True;
finally
JpegImage.Free;
BlobStream.Free;
end;
end
else
Photo.Visible := False;
end;
end.
[解决办法]
会不会是图片的不同格式引起的问题。
[解决办法]
代码仅处理了jpg图片,LZ确定程序a存入的是jpg格式么?不是png或者bmp之类的?
[解决办法]
帮你顶顶帖子先
[解决办法]
对各种格式的图片应区分处理,本人有一个想法也不知对不对,就是不管什么格式的图片先存入数据库,显示之前全转换为jpg格式,因为jpg格式可以在image控件里显示。
[解决办法]
在数据库中添加一列'Image_Type'来存放图片格式,jpg为0;bmp为1
procedure TfrmMain.ADOTable1AfterScroll(DataSet: TDataSet);
var
JpegImage: TJPEGImage;
bmpImage:TBitmap;
BlobStream: TStream;
begin
if (not ADOTable1.FieldByName('Image_List').IsNull) then
begin
BlobStream := ADOTable1.CreateBlobStream(ADOTable1.FieldByName('Image_List'),bmRead);
try
if ADOTable1.FieldByName('Image_Type').AsString = '1' then
begin
bmpImage := TBitmap.Create;
bmpImage.LoadFromStream(BlobStream);
Photo.Picture.Assign(bmpImage);
bmpImage.Free;
end else
begin
JpegImage := TJPEGImage.Create;
JpegImage.LoadFromStream(BlobStream);
Photo.Picture.Assign(JpegImage);
JpegImage.Free;
end;
Photo.Visible := True;
finally
BlobStream.Free;
end;
end
else
Photo.Visible := False;
end;
[解决办法]
delphi 7 下 的TImage 支持 bmp,jpg格式, 不支持 png, 但网上可以找到一个支持 png的; 可以在存取数据库中的图片时统一为 jpg格式就可以了.