【发布时间】: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 您不需要
ClassName或ClassType(顺便说一句,您无需通过ClassType即可访问ClassName)。您可以键入检查Graphic本身。
标签: delphi firemonkey delphi-10.3-rio