我正在使用 Base64 编码字符串转换图像,然后在 Windows Server 上创建它。
它在大多数设备上工作正常,但在 android 版本 2.3.5 中出现错误 java.lang.OutOfMemoryError。我尝试了 android:largeHeap="true"
但它不起作用。
安卓代码:
BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();
strBase64 = Base64.encodeToString(data, Base64.DEFAULT);
我想为用户提供裁剪图像选项,然后将其存储在 Windows 服务器上。有什么更简单更好的方法吗?
我在 asp.net 的代码:
public System.Drawing.Image Base64ToImage(string base64String)
{
byte[] imageBytes = Convert.FromBase64String(base64String);
using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
{
ms.Write(imageBytes, 0, imageBytes.Length);
System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);
return image;
}
}
System.Drawing.Image convertedImage = Base64ToImage(Photo);
convertedImage.Save(Server.MapPath("~\\images\\profileImg\\jeeten.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);
我尝试了一些裁剪图像代码,但它给出了错误:GDI+ 中发生了一般性错误。
最佳答案
我会做这些改变:
- 与其从 ImageView 获取图像,不如考虑使用它的原始来源(文件系统? Assets ?)。这样您就不必重新压缩图像。
- 不要以 100% 质量压缩 JPG。不引人注意的图像质量增益需要付出巨大的代价。如果您需要 100%,请使用 PNG,否则使用 85% 质量的 JPG。
- 您在内存中有多个图像副本 - 在可绘制对象中、在字节数组中、在 base 64 字符串中等。您可以消除其中的一些副本。
- 为什么要转换为 base 64?只需将字节发送到服务器 - 这是一个 example使用 PHP,但在 .NET 中使用 HttpPostedFile接收它。
关于android - java.lang.OutOfMemoryError : (Heap Size=17863KB, 分配=11272KB,位图大小=12444KB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21478432/