Android 如何使用Delphi XE5在IOS上保存位图图片
我需要,我想在我从互联网站下载图像后将图像保存到用户设备(iOS或Android),这样用户就不必多次下载图像 据我所知,在iOS上,我只能保存JPG或PNG文件格式。如何将delphi中的位图文件转换为.JPG或.PNG图片文件? 我在VCL中看到支持TPNGImages,但不支持FMX 当我使用Android 如何使用Delphi XE5在IOS上保存位图图片,android,ios,image,delphi,delphi-xe5,Android,Ios,Image,Delphi,Delphi Xe5,我需要,我想在我从互联网站下载图像后将图像保存到用户设备(iOS或Android),这样用户就不必多次下载图像 据我所知,在iOS上,我只能保存JPG或PNG文件格式。如何将delphi中的位图文件转换为.JPG或.PNG图片文件? 我在VCL中看到支持TPNGImages,但不支持FMX 当我使用SomeBitmap.bitmap.SaveToFile(GetHomePath+PathDelim+'Documents'+PathDelim+'Pictures'+PathDelim+Pictur
SomeBitmap.bitmap.SaveToFile(GetHomePath+PathDelim+'Documents'+PathDelim+'Pictures'+PathDelim+PictureName+'.png';
它不做任何事情,也不抛出异常。
帮助
通过Delphi XE5为iOS/Android开发TBitmap.SaveToFile(保存文件)工作得非常好(至少在Android上-我无法与iOS对话)如果提供了有效的文件名和位置。但是,如果没有,它会自动失败,不会出错,这可能是因为在某些移动操作系统上很难处理异常。因此,实际问题在于提供的文件名或位置,在这种情况下,它似乎就是位置 永远不要假设您可以猜测跨平台的文件夹位置。始终使用由
TPath
中的函数返回的文件夹之一。它们列在下面的Delphi文档中;在这种情况下,您要查找的是TPath.GetPicturesPath
,它在Android上返回类似于”/storage/emulated的内容/0/图片“
。(根据文档,目前iOS设备上没有可访问的图片目录,尽管模拟器上似乎有。这可能是iOS本身的限制;但是,您必须检查Apple iOS文档以确定这一点。iOS上的适当位置似乎位于TPath.G返回的位置。)etDocumentsPath
,根据XE5文档,它类似于”/var/mobile/Applications/class),在所有受支持的平台上支持以下格式:
JPEG (.jpeg, .jpg)
TIFF (.tiff, .tif)
GIF
PNG
BMP
下面是一个在Windows上从位图转换为.png的示例;我没有Android设备在那里测试它,但类似的代码应该适合您(前提是您指定有效的文件夹位置和文件名,如上所述)。使用XE5 Update 2在Win7 64位上编译和测试
procedure TForm1.FormShow(Sender: TObject);
var
BmpIn, BmpOut: TBitmap;
SaveParams: TBitmapCodecSaveParams;
begin
BmpIn := TBitmap.Create;
try
BmpIn.LoadFromFile('E:\TempFiles\ScreenCaps\CheckBoxChecked.bmp');
BmpOut := TBitmap.Create;
try
BmpOut.Assign(BmpIn);
SaveParams.Quality := 100;
BmpOut.SaveToFile('E:\TempFiles\ScreenCaps\CheckBoxChecked.png', @SaveParams);
finally
BmpOut.Free;
end;
finally
BmpIn.Free;
end;
end;
TBitmap.SaveToFile
工作得非常好(至少在Android上-我不能与iOS对话)如果提供了有效的文件名和位置。但是,如果没有,它会自动失败,不会出错,这可能是因为在某些移动操作系统上很难处理异常。因此,实际问题在于提供的文件名或位置,在这种情况下,它似乎就是位置
永远不要假设您可以猜测跨平台的文件夹位置。始终使用由TPath
中的函数返回的文件夹之一。它们列在下面的Delphi文档中;在这种情况下,您要查找的是TPath.GetPicturesPath
,它在Android上返回类似于”/storage/emulated的内容/0/图片“
。(根据文档,目前iOS设备上没有可访问的图片目录,尽管模拟器上似乎有。这可能是iOS本身的限制;但是,您必须检查Apple iOS文档以确定这一点。iOS上的适当位置似乎位于TPath.G返回的位置。)etDocumentsPath
,根据XE5文档,它类似于”/var/mobile/Applications/class),在所有受支持的平台上支持以下格式:
JPEG (.jpeg, .jpg)
TIFF (.tiff, .tif)
GIF
PNG
BMP
下面是一个在Windows上从位图转换为.png的示例;我没有Android设备在那里测试它,但类似的代码应该适合您(前提是您指定有效的文件夹位置和文件名,如上所述)。使用XE5 Update 2在Win7 64位上编译和测试
procedure TForm1.FormShow(Sender: TObject);
var
BmpIn, BmpOut: TBitmap;
SaveParams: TBitmapCodecSaveParams;
begin
BmpIn := TBitmap.Create;
try
BmpIn.LoadFromFile('E:\TempFiles\ScreenCaps\CheckBoxChecked.bmp');
BmpOut := TBitmap.Create;
try
BmpOut.Assign(BmpIn);
SaveParams.Quality := 100;
BmpOut.SaveToFile('E:\TempFiles\ScreenCaps\CheckBoxChecked.png', @SaveParams);
finally
BmpOut.Free;
end;
finally
BmpIn.Free;
end;
end;
这里有很多事情需要澄清:
坦率地说,FMX源代码表现出一种极其愚蠢的异常恐惧症,尽管个别情况会随着时间的推移而得到修复。XE5中这种恐惧症的一个例子是TBitmap.SaveToFile
,当给定无效输入时,它通常会无声地失败
正如Ken White所说,您不应该假设系统定义的文件夹位于何处。也就是说,我对IOUtils
不太感兴趣,即使必须使用它(除非您直接调用本机API函数)简言之,使用简单的PathDelim
方法是完全有效的,但对于IOUtils
而言,愚蠢地不遵守传统的Delphi RTL命名约定,XxxPath
意味着“包含一个尾随路径分隔符”;正是由于这种差异,TPath.Combine
才发挥作用
您认为FMXTBitmap
与VCL类一样保存为BMP格式的明显假设是不正确的-默认情况下,它保存为PNG格式
这里有很多事情需要澄清:
坦率地说,FMX源代码表现出一种极其愚蠢的异常恐惧症,尽管个别情况会随着时间的推移而得到修复。XE5中这种恐惧症的一个例子是TBitmap.SaveToFile
,当给定无效输入时,它通常会无声地失败
正如Ken White所说,您不应该假设系统定义的文件夹位于何处。也就是说,我对IOUtils
不太感兴趣,即使必须使用它(除非您直接调用本机API函数)简而言之,使用简单的PathDelim
方法是完全有效的,但对于IOUtils
而言,愚蠢地不遵守传统的Delphi RTL命名约定,XxxPath
意味着“包含一个尾随路径分隔符”;正是由于这种分歧,TPath.Combine
才出现
procedure TForm1.FormShow(Sender: TObject);
var
BmpIn, BmpOut: TBitmap;
SaveParams: TBitmapCodecSaveParams;
begin
BmpIn := TBitmap.Create;
try
BmpIn.LoadFromFile('E:\TempFiles\ScreenCaps\CheckBoxChecked.bmp');
BmpOut := TBitmap.Create;
try
BmpOut.Assign(BmpIn);
SaveParams.Quality := 100;
BmpOut.SaveToFile('E:\TempFiles\ScreenCaps\CheckBoxChecked.png', @SaveParams);
finally
BmpOut.Free;
end;
finally
BmpIn.Free;
end;
end;