将来自Access数据库的JPEG图像加载到TDBImage组件中

问题描述

我正在尝试将数据库映像链接到delphi 10中的TDBImage组件,但是它一直给我一个错误,即使没有语法错误,我的指定字段也找不到。 这是我正在使用的代码

function TForm1.JPEGStartBlob(fPic: TBlobField): integer;
var
  bS: TAdoblobStream;
  buffer: Word;
  hx: string;
begin
  Result := -1;

  bS := TAdoblobStream.Create(fPic,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 TForm1.ShowImage(Sender: TObject);
var
 bsImage : TAdoblobStream;
 jImage : TJPEGImage;
begin
  bsImage := TAdoblobStream.Create(adoLodgeI.FieldByName('Image') // this is the field that can't be 
                                                                 // found
      AS TBlobField,bmRead);

  try
    bsImage.Seek(JPEGStartBlob(adoLodgeI.FieldByName('Image') AS TBlobField),soFromBeginning);
    jImage := TJPEGImage.Create;
    try
      jImage.LoadFromStream(bsImage);
      dbiLodge1.Picture.Graphic := jImage;
    finally
      jImage.Free;
    end;
  finally
    bsImage.Free;
  end;
end;

如果有人可以帮助,将不胜感激。

解决方法

您可以使用TWICImage,然后直接为它分配一个TDBImage.Picture

Var
  AStream: TMemoryStream;
  APic: TWICImage;
begin
  AStream := TMemoryStream.Create;
  try
    // Here "Data" is a BlobField
    AStream:= TMemoryStream(TPics.CreateBlobStream(TPics.FieldByName('Data'),bmRead));
    AStream.Position:= 0;
    APic := TWICImage.Create;
    try
      APic.LoadFromStream(AStream);
      DBImage1.Picture.Assign(APic);
    finally
      APic.Free;
    end;
  finally
    AStream.Free;
  end;
end;

可以处理*.jpeg;*.jpg;*.png;*.bmp;*.ico张图片,而无需担心图片是否为TJPEGImage