1.请确保你的JPEG是标准格式
2.试试下面的方法
const
WMFKey = Integer($9AC6CDD7);
WMFWord = $CDD7;
rc3_StockIcon = 0;
rc3_Icon = 1;
rc3_Cursor = 2;
type
TGraphicHeader = record
Count: Word;
HType: Word;
Size: Longint;
end;
TMetafileHeader = packed record
Key: Longint;
Handle: SmallInt;
Box: TSmallRect;
Inch: Word;
Reserved: Longint;
CheckSum: Word;
end;
TCursorOrIcon = packed record
Reserved: Word;
wType: Word;
Count: Word;
end;
//------------------------------------------------------
// Created: 2005-06-12
// Author: jfyes
// Type: procedure
// Function: DrawFieldGraphic
//------------------------------------------------------
procedure DrawFieldGraphic(BlobField: TBlobField; Picture: TPicture);
var
s: TStream;
pos: Integer;
Header: TGraphicHeader;
BMPHeader: TBitmapFileHeader;
//{$IFDEF JPEG}
JPEGHeader: array[0..1] of Byte;
//{$ENDIF}
EMFHeader: TEnhMetaHeader;
WMFHeader: TMetafileHeader;
ICOHeader: TCursorOrIcon;
NewGraphic: TGraphic;
begin
if BlobField.IsNull then
begin
Picture.Assign(nil);
Exit;
end;
s := nil;
try
S := BlobField.DataSet.CreateBlobStream(BlobField, bmRead);
NewGraphic := nil;
if s = nil then Exit;
if s.Size > 0 then
begin
// skip Delphi blob-image header
if s.Size >= SizeOf(TGraphicHeader) then
begin
s.Read(Header, SizeOf(Header));
if (Header.Count <> 1) or (Header.HType <> $0100) or
(Header.Size <> s.Size - SizeOf(Header)) then
s.Position := 0;
end;
pos := s.Position;
// try bmp header
s.ReadBuffer(BMPHeader, SizeOf(BMPHeader));
s.Position := pos;
if BMPHeader.bfType = $4D42 then
NewGraphic := TBitmap.Create
else
begin
//{$IFDEF JPEG}
// try jpeg header
s.ReadBuffer(JPEGHeader, SizeOf(JPEGHeader));
s.Position := pos;
if (JPEGHeader[0] = $FF) and (JPEGHeader[1] = $D8) then
NewGraphic := TJPEGImage.Create
else
//{$ENDIF}
begin
// try wmf header
s.ReadBuffer(WMFHeader, SizeOf(WMFHeader));
s.Position := pos;
if WMFHeader.Key = WMFKEY then
NewGraphic := TMetafile.Create
else
begin
// try emf header
s.ReadBuffer(EMFHeader, SizeOf(EMFHeader));
s.Position := pos;
if EMFHeader.dSignature = ENHMETA_SIGNATURE then
NewGraphic := TMetafile.Create
else
begin
// try icon header
s.ReadBuffer(ICOHeader, SizeOf(ICOHeader));
s.Position := pos;
if ICOHeader.wType in [RC3_STOCKICON, RC3_ICON] then
NewGraphic := TIcon.Create;
end;
end;
end;
end;
end;
if NewGraphic <> nil then
begin
Picture.Graphic := NewGraphic;
NewGraphic.Free;
Picture.Graphic.LoadFromStream(s);
end
else
Picture.Assign(nil);
finally
if s <> nil then
s.Free;
end;
end;