0

現在、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;
4

1 に答える 1

0

ADOTable1['Image'] を返すものは何ですか?

実際の型がわからず、型チェックを使用して物事を制御できないため、使用する FieldVallues プロパティは好きではありません。Data.DB.TDataSet.FieldByName を使用したほうがよいと思います。まさに TField オブジェクトのタイプから、含まれるデータの種類がわかります。

Microsoft Jet (Excel と Access のデータベース エンジン) については知りませんが、未加工の BMP ファイル データと、ペイント アプリケーション (または Gimp、Photoshop、または BMP の編集に使用されるもの) へのリンクが保存されていると思います。考える。

http://support.microsoft.com/kb/205635/en-us - これは、OLE ファイルからファイルを保存する方法のスニペットを示しています。

フィールドの内容を TFileStream に保存する方法を見つけてください。

作成したファイルが本当に BMP ファイルであることを確認してください。その後、ブロブを TMemoryStream と TBitmap.LoadFromStream に保存します。

Data.DB.TBlobField.SaveToStream、Data.DB.TField.AsBytes を検討してください。

ドキュメントからのもう 1 つのスニペット - これらのクラスを使用できる場合は、これらのクラスを調べてください。 ."

履歴書として:

1) データのタイプを取得します - ADOTable1.FieldByName.ClassName データを取得するためにどのメソッド プロパティが使用できるかを読んでください 2) データをファイルに保存して、それが何であるかを分析してみてください 3) そのデータをストリームに保存してみてください画像の読み込みに再利用

于 2012-07-18T13:41:55.593 に答える