TBitmap.SaveToFile
適用於iOS/Android的發展非常好(至少在Android的 - 我不能到iOS說吧)給出一個有效的文件名和位置時。但是,如果你不這樣做,它只是在沒有錯誤的情況下靜靜地失敗,可能是因爲在一些移動操作系統上異常很難處理。所以實際的問題是提供的文件名或位置,在這種情況下,它似乎是它的位置。
永遠不要假設你可以猜測跨平臺的文件夾位置。請始終使用TPath
中函數返回的文件夾之一。他們被列在德爾福文檔Standard RTL Path Functions across the Supported Target Platforms下;在這種情況下,您正在尋找TPath.GetPicturesPath
,它在Android上返回類似'/storage/emulated/0/Pictures'
。 (根據文檔,目前iOS設備上沒有可訪問的圖片目錄,儘管似乎在模擬器上,這可能是iOS本身的限制;您必須檢查Apple iOS文檔以確定然而,iOS上的適當位置似乎在TPath.GetDocumentsPath
返回的位置,根據XE5文檔,它類似於'/var/mobile/Applications/<application ID>/Documents'
。)
其次,永遠不會手動連接路徑的各個部分。使用TPath.Combine
(來自IOUtils
單元),如果需要,它將自動將路徑分隔符添加到適當的位置。如果你需要的話,你可以將多個調用來獲得子文件夾中所要求的水平:
對於可讀性/可維護性(iOS的位置證明):
Dest := TPath.Combine(TPath.GetDocumentsPath, 'mydir');
Dest := TPath.Combine(Dest, 'tests');
或(爲了簡潔):
Dest := TPath.Combine(TPath.Combine(TPath.GetDocumentsPath, 'mydir'), 'tests');
如果你需要創建沿途的文件夾,TDirectory.CreateDirectory
將創建它們,如將SysUtils.ForceDirectories
;兩者均可在所有支持的平臺上使用。 (請注意,它的SysUtils
版本的ForceDirectories
是跨平臺的,而不是FileCtrl
版本,這是Windows專用。)
if not TDirectory.Exists(Dest, False) then
TDirectory.CreateDirectory(Dest);
// or
// SysUtils.ForceDirectories(Dest);
至於文件格式,FMX.Graphics.TBitmap(通過TBitmapCodecManager類)在所有支持的平臺上支持以下格式:
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;
那麼轉換爲png或jpeg的問題呢?這是如何完成的? –
我可以從克里斯的回答中看到這一點,但它並未在你的身上出現。 –
@Jordan:我用'ForceDirectories'段落(在第二個'TPath.Combine'示例之後)覆蓋了該段落。 –