Android 如何使用Delphi XE5在IOS上保存位图图片

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

我需要,我想在我从互联网站下载图像后将图像保存到用户设备(iOS或Android),这样用户就不必多次下载图像

据我所知,在iOS上,我只能保存JPG或PNG文件格式。如何将delphi中的位图文件转换为.JPG或.PNG图片文件? 我在VCL中看到支持TPNGImages,但不支持FMX

当我使用
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
    才发挥作用

  • 您认为FMX
    TBitmap
    与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;