現在、OLE オブジェクト フィールドがあり、有効なビットマップを含む MS Access データベースからイメージを読み込もうとしています (テスト目的で、MS ペイントを使用してイメージを作成し、24 ビット bmp で保存しました)。
DBGrid経由でこれにリンクしています。理論的には、すべてがうまく機能し、画像が表示されるはずですが、「ビットマップ画像が無効です」というエラーが表示されます。これが .bmp ではなく JPEG であるかどうかは理解できますが、そうではありません。だから私の質問は、何が間違っているのですか?
必ずしも DBImage を使用する必要はありません。通常の TImage も問題なく使用できます (より望ましい場合もあります) が、TImage を MS Access データベースの OLE オブジェクト フィールドに割り当てる方法がわかりません。私は試してみましたが、役に立ちませんでした:
//Select photo from Image field
Image1.Picture := ADOTable1['Image'];
この問題に関する about.com などのほとんどの記事を読みましたが、まだ良い結果は得られません。
どんな助けでも大歓迎です!
更新:これは私のために働いた:
USES 句に追加: JPEG、ADODB、DB
function JpegStartsInBlob
(PicField:TBlobField):integer;
var
bS : TADOBlobStream;
buffer : Word;
hx : string;
begin
Result := -1;
bS := TADOBlobStream.Create(PicField, bmRead);
try
while (Result = -1) and
(bS.Position + 1 < bS.Size) do
begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'FF' then begin
bS.ReadBuffer(buffer, 1);
hx:=IntToHex(buffer, 2);
if hx = 'D8' then Result := bS.Position - 2
else if hx = 'FF' then
bS.Position := bS.Position-1;
end;
end;
finally
bS.Free
end;
end;
procedure TfrmOne.btnShowImageClick(Sender: TObject);
var
bS : TADOBlobStream;
Pic : TJPEGImage;
begin
bS := TADOBlobStream.Create(table1.FieldByName('Photo') as TBlobField, bmRead);
bS.Seek(JpegStartsInBlob(table1.FieldByName('Photo') as TBlobField),
soFromBeginning);
Pic := TJPEGImage.Create;
Pic.LoadFromStream(bS);
frmOne.Image1.Picture.Graphic := Pic;
Pic.Free;
bS.Free;
end;