将 Jnet_uri 转换为 delphi 中的 Tbitmap
Convert Jnet_uri to Tbitmap in delphi
在某个应用中,我通过 Android 图库 select 照片。因为我想一次 select 多张照片,所以我使用了 JIntent
函数。现在,一切正常,我想将 selected 照片加载到 TMSFMXtableview
。为此,我需要将照片从 JNet_Uri
转换为 TBitmap
。最好的方法是什么?
这是我想用来将照片加载到 TMSFMXtableview
:
中的代码
function TfmMain.OnActivityResult(RequestCode: Integer; ResultCode: Integer; Data: Jintent): Boolean;
var
I,count: Integer;
ImageUri : Jnet_Uri;
Fid : Integer;
bitmap : Tbitmap;
begin
Result := False;
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FmessageSubscriptionID);
FmessageSubscriptionID := 0;
if requestcode=LibraryRequestCode then
begin
if ResultCode=TJActivity.JavaClass.RESULT_OK then
begin
if assigned(data) then
begin
Count := data.getClipData.getItemCount;
for I := 0 to count-1 do
begin
ImageUri := data.getClipData.getItemAt(i).getUri;
bitmap := //convert the imageuri to a Tbitmap
tv2.Items.Add;
FID := tv2.Items.Count-1;
tv2.Items.Items[FID].Bitmap.Assign(bitmap);
tv2.Items.Items[FID].Caption := 'NEW';
end;
end;
end
else
if ResultCode= TJActivity.JavaClass.RESULT_CANCELED then
begin
end;
result := true;
end;
end;
恐怕没那么简单。此代码(来自 Dave Nottage 提供的示例)可能对您有所帮助。 AddAFile
将 Jnet_URI
作为输入参数并将该文件保存到 GetPublicPath
。如果您愿意,您当然可以选择将 array of bytes
保存到流中,然后从该流中加载位图。
function TfrmChat.AddAFile(const AURI: Jnet_Uri): TBitMap;
var
LSelectedFile: TSelectedFile;
LProjection: TJavaObjectArray<JString>;
LCursor: JCursor;
LURI: Jnet_Uri;
LInput: JInputStream;
LJavaBytes: TJavaArray<Byte>;
LBytes: TBytes;
FileName: String;
APath, AFileName: String;
lStream: TMemoryStream;
begin
if AURI = nil then
EXIT;
LSelectedFile.RawPath := JStringToString(AURI.toString);
LSelectedFile.DecodedPath := JStringToString(TJnet_Uri.JavaClass.decode(AURI.toString));
LProjection := TJavaObjectArray<JString>.Create(1);
try
LProjection[0] := TJMediaStore_MediaColumns.JavaClass.DISPLAY_NAME;
LCursor := TAndroidHelper.Context.getContentResolver.query(AURI, LProjection, nil, nil, nil);
finally
LProjection.Free;
end;
if LCursor = nil then
EXIT;
try
if LCursor.moveToFirst then
LSelectedFile.DisplayName := JStringToString(LCursor.getString(0));
FileName := lSelectedFile.DisplayName;
LURI := TJnet_Uri.JavaClass.parse(AURI.toString); // raw path again
LInput := TAndroidHelper.Context.getContentResolver.openInputStream(LURI);
// copy java input stream to array of bytes
LJavaBytes := TJavaArray<Byte>.Create(LInput.available);
try
LInput.read(LJavaBytes, 0, LJavaBytes.Length);
SetLength(LBytes, LJavaBytes.Length);
Move(LJavaBytes.Data^, LBytes[0], LJavaBytes.Length);
finally
LJavaBytes.Free;
end;
// write the bytes to a local file
// APath := System.IOUtils.TPath.GetPublicPath;
// AFileName := TPath.Combine(aPath, FileName);
// TFile.WriteAllBytes(AFileName, LBytes);
// create a bitmap to return
lStream := TMemoryStream.Create;
try
lStream.WriteBuffer(LBytes[0], length(lBytes));
Result := TBitmap.CreateFromStream(lStream);
finally
lStream.Free;
end;
finally
LCursor.Close;
end;
end;
[编辑]我已经把程序改成了一个函数,returns一个TBitmap。你可以这样使用它:
var
lBitMap: TBitMap;
begin
lBitMap := AddFile(ImageUri);
try
// do stuff with the bitmap
finally
lBitMap.Free;
end;
在某个应用中,我通过 Android 图库 select 照片。因为我想一次 select 多张照片,所以我使用了 JIntent
函数。现在,一切正常,我想将 selected 照片加载到 TMSFMXtableview
。为此,我需要将照片从 JNet_Uri
转换为 TBitmap
。最好的方法是什么?
这是我想用来将照片加载到 TMSFMXtableview
:
function TfmMain.OnActivityResult(RequestCode: Integer; ResultCode: Integer; Data: Jintent): Boolean;
var
I,count: Integer;
ImageUri : Jnet_Uri;
Fid : Integer;
bitmap : Tbitmap;
begin
Result := False;
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FmessageSubscriptionID);
FmessageSubscriptionID := 0;
if requestcode=LibraryRequestCode then
begin
if ResultCode=TJActivity.JavaClass.RESULT_OK then
begin
if assigned(data) then
begin
Count := data.getClipData.getItemCount;
for I := 0 to count-1 do
begin
ImageUri := data.getClipData.getItemAt(i).getUri;
bitmap := //convert the imageuri to a Tbitmap
tv2.Items.Add;
FID := tv2.Items.Count-1;
tv2.Items.Items[FID].Bitmap.Assign(bitmap);
tv2.Items.Items[FID].Caption := 'NEW';
end;
end;
end
else
if ResultCode= TJActivity.JavaClass.RESULT_CANCELED then
begin
end;
result := true;
end;
end;
恐怕没那么简单。此代码(来自 Dave Nottage 提供的示例)可能对您有所帮助。 AddAFile
将 Jnet_URI
作为输入参数并将该文件保存到 GetPublicPath
。如果您愿意,您当然可以选择将 array of bytes
保存到流中,然后从该流中加载位图。
function TfrmChat.AddAFile(const AURI: Jnet_Uri): TBitMap;
var
LSelectedFile: TSelectedFile;
LProjection: TJavaObjectArray<JString>;
LCursor: JCursor;
LURI: Jnet_Uri;
LInput: JInputStream;
LJavaBytes: TJavaArray<Byte>;
LBytes: TBytes;
FileName: String;
APath, AFileName: String;
lStream: TMemoryStream;
begin
if AURI = nil then
EXIT;
LSelectedFile.RawPath := JStringToString(AURI.toString);
LSelectedFile.DecodedPath := JStringToString(TJnet_Uri.JavaClass.decode(AURI.toString));
LProjection := TJavaObjectArray<JString>.Create(1);
try
LProjection[0] := TJMediaStore_MediaColumns.JavaClass.DISPLAY_NAME;
LCursor := TAndroidHelper.Context.getContentResolver.query(AURI, LProjection, nil, nil, nil);
finally
LProjection.Free;
end;
if LCursor = nil then
EXIT;
try
if LCursor.moveToFirst then
LSelectedFile.DisplayName := JStringToString(LCursor.getString(0));
FileName := lSelectedFile.DisplayName;
LURI := TJnet_Uri.JavaClass.parse(AURI.toString); // raw path again
LInput := TAndroidHelper.Context.getContentResolver.openInputStream(LURI);
// copy java input stream to array of bytes
LJavaBytes := TJavaArray<Byte>.Create(LInput.available);
try
LInput.read(LJavaBytes, 0, LJavaBytes.Length);
SetLength(LBytes, LJavaBytes.Length);
Move(LJavaBytes.Data^, LBytes[0], LJavaBytes.Length);
finally
LJavaBytes.Free;
end;
// write the bytes to a local file
// APath := System.IOUtils.TPath.GetPublicPath;
// AFileName := TPath.Combine(aPath, FileName);
// TFile.WriteAllBytes(AFileName, LBytes);
// create a bitmap to return
lStream := TMemoryStream.Create;
try
lStream.WriteBuffer(LBytes[0], length(lBytes));
Result := TBitmap.CreateFromStream(lStream);
finally
lStream.Free;
end;
finally
LCursor.Close;
end;
end;
[编辑]我已经把程序改成了一个函数,returns一个TBitmap。你可以这样使用它:
var
lBitMap: TBitMap;
begin
lBitMap := AddFile(ImageUri);
try
// do stuff with the bitmap
finally
lBitMap.Free;
end;