【问题标题】:Delphi detecting image type in TImageControlDelphi在TImageControl中检测图像类型
【发布时间】:2020-07-11 06:30:42
【问题描述】:

我正在尝试检测 FMX 的 TImageControl 中加载的图像类型。我正在使用 Delphi 10.3 Rio。

我的代码如下:

function DetectImage(BM: TBitmap): string;
var
  MS: TMemoryStream;
  FirstBytes: AnsiString;
begin
  MS := TMemoryStream.Create;
  try
    BM.SaveToStream(MS);
    SetLength(FirstBytes, 8);
    MS.Read(FirstBytes[1], 8);
    if Copy(FirstBytes, 1, 2) = 'BM' then
    begin
      Result := 'bmp';
    end
    else if FirstBytes = #137'PNG'#13#10#26#10 then
    begin
      Result := 'png';
    end
    else if Copy(FirstBytes, 1, 3) = 'GIF' then
    begin
      Result := 'gif';
    end
    else if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
    begin
      Result := 'jpg';
    end
    else
      Result := '?';

  finally
    MS.Free;
  end;
end;

procedure TfrmMain.imgTeamAChange(Sender: TObject);
begin
 ShowMessage(DetectImage(imgTeamA.Bitmap))  ;
end;

所以,当我单击 TImageControl 进行更改时,我总是得到“?”结果。

我如何使它工作?

【问题讨论】:

  • 即使您完成了这项工作,您肯定也知道位图中的内容。在将图像加载到位图中之前,您需要进行检查。至于您的代码有什么问题,那么您在读取之前不要回溯到流的开头。因此,Read 返回零,您无需检查。
  • 以防我的第一句话太神秘,当你保存位图时,你会得到一个 BMP 文件。你不会得到一个png。你不会得到一个jpeg。你不会得到 gif。
  • 你可以读 TImage.Picture.Graphic.ClassType.ClassName
  • @DejanDozet 您需要从文件对话框中获取该信息,而不是从 TImage。尤其是文件路径。一旦将新文件加载到 TImage 中就会丢失,因此您需要将路径保存在以后可以使用的位置。
  • @RenateSchaaf 您不需要ClassNameClassType(顺便说一句,您无需通过ClassType 即可访问ClassName)。您可以键入检查 Graphic 本身。

标签: delphi firemonkey delphi-10.3-rio


【解决方案1】:

哦,我不知道TImageControl 有一个带有const FileName: string 参数的OnLoaded 事件,这太完美了!再好不过了!

【讨论】:

  • 我们认为您使用的是 VCL 的 TImage,而不是 FMX 的 TImageControl。下次,请更具体地了解您实际使用的框架和控件。
  • @RemyLebeau,我最不想让你感到困惑,相信我。那么VCL中有TImageControl吗?
  • VCL 有TImage,而不是TImageControl。不同的控件,不同的功能。
  • 确实,VCL 之于 FMX,就像汽车之于飞机一样。
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 2014-09-11
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2021-06-17
相关资源
最近更新 更多