android - java.lang.OutOfMemoryError : (Heap Size=17863KB, 分配=11272KB,位图大小=12444KB)

标签 android asp.net bitmap

我正在使用 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/

相关文章:

android - android 中的 Fragments 问题

android - 可重用布局android的类

asp.net - NHibernate - 访问同一个数据库的两个 SessionFactories

java - 方法 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)

C++ 从值数组中保存图像的快速方法

java - 如何在 Android Studio 中使用 com.google.android.collect.list

android - 从android中的firebase数据库获取用户排名

c# - 如何在 GridView asp.net 中读取特定列中的所有行并在绑定(bind)之前进行更改

asp.net - 使用 javascript 将值加载到 ASP.NET 控件

android - 在应用程序的圆形 ImageView 中显示 FB 个人资料图片