安卓。如何在真正的大图像(位图)上写文字并保存

标签 android image exception

您好!

是以下问题:我需要在相当大的图像上写一段长文本并将其保存在那里。

条件:

  1. 图片尺寸超过 3000 x 2000;
  2. 不允许将图像分成几部分,因为文本要从边到边写在整个图像上。
  3. 补充:我不能使用位图比例或矩阵比例,因为必须在原始图像(全尺寸)上书写文本。
  4. 添加:当我向用户显示图像时,我使用位图缩放:options.inSampleSize = 10; 没有内存不足的问题

目前的问题:

当我尝试在位图中加载此图像时,由于内存(VM 预算)的限制而发生错误。

问题:

  1. 如何在不加载到内存的情况下在大图像上输入文字?
  2. 现有的图书馆可以吗?

代码示例:

// Step 1. Open image and load to Bitmap
Bitmap bitmap = BitmapFactory.decodeFile(fileName); // runtime Exception like "VM budget" !
// or
//Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.big_img_1); // as in previous runtime Exception like "VM budget" !
// or
//Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);  // as in previous runtime Exception like "VM budget" !


// Step 2. Write text
Paint paint = new Paint();
paint.setColor(Color.BLACK);
paint.setTextSize(14);

Canvas canvas = new Canvas(bitmap);
canvas.drawText("some  long  long  string  over  all  image", 100, 100, paint);

// Step 3. Save bitmap to file
OutputStream fOut = new FileOutputStream(new File(fileName));
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
/*
     _________________________________________________
    |                                                |
    |                                                |
    |                                                |
    |                                                |
    |                     IMG                        |
    |                                                |
    |                                                |
    |   some  long  long  string  over  all  image   |
    |________________________________________________|
    */

最佳答案

首先使用下面的帮助加载大位图

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

其次要在图片上写字并保存,可以用canvas

我在一个应用程序中做了类似的事情。使用 Canvas 。

我编辑了一段代码,它实际上在背景上添加了一些其他图像等等。

代码内容:

private static Bitmap getPoster(...) {
Bitmap background = BitmapFactory.decodeResource(res, background_id)
    .copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(background);
Typeface font = Typeface.createFromAsset(res.getAssets(), FONT_PATH);
font = Typeface.create(font, Typeface.BOLD);
Paint paint = new Paint();
paint.setTypeface(font);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Style.FILL);
paint.setShadowLayer(2.0f, 1.0f, 1.0f, Color.BLACK);
float fontSize = getFontSize(background.getWidth(), THE_QUOTE, paint); //You'll have to define a way to find a size that fits, or just use a constant size.

paint.setTextSize(fontSize);
canvas.drawText(THE_QUOTE, (background.getWidth() - paint.measureText(THE_QUOTE)) / 2,
    background.getHeight() - FILLER_HEIGHT, paint); //You might want to do something different. In my case every image has a filler in the bottom which is 50px. 
return background;
}

将您自己的版本放入一个类中,并为其提供图像 ID 和其他任何内容。它返回一个位图供您做任何您想做的事情(在 ImageView 中显示它,让用户保存它并设置为墙纸)。

关于安卓。如何在真正的大图像(位图)上写文字并保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17292868/

相关文章:

java - AudioTrack 采样率不一致

android - 在 Android 虚拟机/模拟器上测试 USB 外设

javascript - 在响应式网页设计中提供资源文件(JS、CSS、图像)的最佳实践

c++ - std::exception 在信号处理程序中调用 exit 时在全局线程对象上发生

android - 如何将 Android 应用的翻译说明上传到开发人员控制台?

android - 尝试读取字段 'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView'

javascript - 使用 JavaScript 通过鼠标悬停放大图像

javascript - ReactJS,在 <img> 标签中呈现 base64 字符串给出错误 ERR_INVALID_URL

java - .NET 与 Java 中的异常处理

c# - 如何覆盖 Owin 中默认的未处理异常输出?