正在保存图像缩略图而不是 MediaStore.ActionImageCapture 中的完整图像
Image thumbnail being saved instead of full-image from MediaStore.ActionImageCapture
我目前正在尝试通过 android 拍照,并将图像保存在稍后将其上传到数据库的位置。在网上学习了一些教程之后,我发现我使用的代码只保存了我正在捕获的图像的低分辨率缩略图,而不是完整图像。
有没有办法获取完整尺寸的图像进行保存?由于使用数据库的软件的设置方式,格式需要为 Jpeg。
按预期拍摄照片:
private void _openCamera_Click(object sender, EventArgs e)
{
Intent intent = new Intent(MediaStore.ActionImageCapture);
StartActivityForResult(intent, 0);
}
这是图像最终保存为缩略图的地方。理想情况下,这部分将是我们修改的唯一代码:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
Bitmap bitmap = (Bitmap)data.Extras.Get("data");
this._photo.SetImageBitmap(bitmap);
MemoryStream memStream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
this._tempImageData = memStream.ToArray();
}
更新: SushiHangover 的响应完美无缺。为了使用缓存的图像,我使用了以下代码:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (resultCode != Result.Ok || requestCode != 88)
{
return;
}
Bitmap bitmap = BitmapFactory.DecodeFile(cacheName);
this._photo.SetImageBitmap(bitmap);
MemoryStream memStream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
this._tempImageData = memStream.ToArray();
}
这是真正简化 C# 版本的官方Android Photo Basics for a full-size photo。
注意:这会将完整尺寸的照片保存在应用程序的沙盒 cache
目录中
添加一个"Resources/xml/file_paths.xml"文件:
<?xml version="1.0" encoding="UTF-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="cache_images" path="." />
</paths>
在 清单的application
open/close 标签中添加文件提供程序:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>
创建照片文件并请求照片应用程序:
cacheName = Path.Combine(CacheDir.AbsolutePath, Path.GetTempFileName());
using (var cacheFile = new Java.IO.File(cacheName))
using (var photoURI = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", cacheFile))
using (var intent = new Intent(MediaStore.ActionImageCapture))
{
intent.PutExtra(MediaStore.ExtraOutput, photoURI);
StartActivityForResult(intent, 88);
}
注意:cacheName
是一个class级变量,在OnActivityResult方法中会用到
在 OnActivityResult 中,对您的照片进行处理...
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
if (resultCode == Result.Ok && requestCode == 88)
{
// Do something with your photo...
Log.Debug("SO", cacheName );
}
}
我目前正在尝试通过 android 拍照,并将图像保存在稍后将其上传到数据库的位置。在网上学习了一些教程之后,我发现我使用的代码只保存了我正在捕获的图像的低分辨率缩略图,而不是完整图像。
有没有办法获取完整尺寸的图像进行保存?由于使用数据库的软件的设置方式,格式需要为 Jpeg。
按预期拍摄照片:
private void _openCamera_Click(object sender, EventArgs e)
{
Intent intent = new Intent(MediaStore.ActionImageCapture);
StartActivityForResult(intent, 0);
}
这是图像最终保存为缩略图的地方。理想情况下,这部分将是我们修改的唯一代码:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
Bitmap bitmap = (Bitmap)data.Extras.Get("data");
this._photo.SetImageBitmap(bitmap);
MemoryStream memStream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
this._tempImageData = memStream.ToArray();
}
更新: SushiHangover 的响应完美无缺。为了使用缓存的图像,我使用了以下代码:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (resultCode != Result.Ok || requestCode != 88)
{
return;
}
Bitmap bitmap = BitmapFactory.DecodeFile(cacheName);
this._photo.SetImageBitmap(bitmap);
MemoryStream memStream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
this._tempImageData = memStream.ToArray();
}
这是真正简化 C# 版本的官方Android Photo Basics for a full-size photo。
注意:这会将完整尺寸的照片保存在应用程序的沙盒 cache
目录中
添加一个"Resources/xml/file_paths.xml"文件:
<?xml version="1.0" encoding="UTF-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="cache_images" path="." />
</paths>
在 清单的application
open/close 标签中添加文件提供程序:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
</provider>
创建照片文件并请求照片应用程序:
cacheName = Path.Combine(CacheDir.AbsolutePath, Path.GetTempFileName());
using (var cacheFile = new Java.IO.File(cacheName))
using (var photoURI = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", cacheFile))
using (var intent = new Intent(MediaStore.ActionImageCapture))
{
intent.PutExtra(MediaStore.ExtraOutput, photoURI);
StartActivityForResult(intent, 88);
}
注意:cacheName
是一个class级变量,在OnActivityResult方法中会用到
在 OnActivityResult 中,对您的照片进行处理...
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
if (resultCode == Result.Ok && requestCode == 88)
{
// Do something with your photo...
Log.Debug("SO", cacheName );
}
}