0

我正在图像上写一些将被压缩的文本。

图像 sie2048 x 1536东西 px

我第一次尝试先写它会抛出OutOfMemory Exception

然后我首先将其压缩为1024 x 768

然后在图像上写文字

它将图像 KB 从100KB增加到640KB

在写文字时,我compromise可以Image quality but not the text Quality

设置为文本的压缩质量 30 也可以downsample

问题:

  1. 是否有任何过程write then compressCompress then Write
    文本而不更改 ImageSize(以 KB 为单位)?

  2. 我希望图像大小(以 KB 为单位)尽可能小?

  3. 而且当 inSampleSize 设置为 3 时,它不起作用,并且只有使用 1 、 2 、 4 的 2048 、 1024 、 512 的图像被创建为输出,我想要一些尺寸的图像在 700px 左右保持纵横比。

代码:

冲压图像的方法

public void stampMyImage(String filePath, String text, Bitmap bitmap) {
        String[] str = text.split("\n");
        filePath = "/sdcard/geoTag/1imagelong_001_001_0002_0002_1135_130708144229.jpg";
        bitmap = BitmapFactory.decodeFile(filePath);
        if (bitmap != null) {
            Bitmap dest = null;
            try {
                dest = bitmap.copy(bitmap.getConfig(), true);
            } catch (OutOfMemoryError e1) {
                Log.e("Exception", e1.getMessage());
                e1.printStackTrace();
            } catch (Error e) {
                Log.e("Exception", e.getMessage());
                e.printStackTrace();
            }
            Canvas cs = new Canvas(dest);
            Typeface tf = Typeface.create("Verdana", Typeface.BOLD);
            Paint tPaint = new Paint();
            tPaint.setAntiAlias(true);
            tPaint.setTextSize(40);
            tPaint.setTextAlign(Align.LEFT);
            tPaint.setTypeface(tf);
            tPaint.setColor(Color.RED);
            tPaint.setStyle(Style.FILL_AND_STROKE);
            cs.drawBitmap(bitmap, 0f, 0f, null);
            float textHeight = tPaint.measureText("yY");
            int index = 0;
            for (String Oneline : str) {
                cs.drawText(Oneline, 20f, (index + 1) * textHeight + 25f,
                        tPaint);
                index++;
            }
            try {
                FileOutputStream fos = new FileOutputStream(
                        "/sdcard/timeStampedImage.jpg");
                dest.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

正则压缩方法

 BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    int quality = 70;
    myBitmapClose = BitmapFactory.decodeFile(imgUriClose.getPath(),options);
    if (myBitmapClose != null) {
        File sdImageMainDirectory = new File(imgUriClose.getPath());
        try {
        FileOutputStream fileOutputStream = new FileOutputStream(sdImageMainDirectory);
        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
        myBitmapClose.compress(CompressFormat.JPEG, quality, bos);
        if (bos != null) {
        bos.flush();
        bos.close();
        }
        if (fileOutputStream != null) {
        fileOutputStream.flush();
        fileOutputStream.close();
        }
        } catch (FileNotFoundException e) {
        e.printStackTrace();
        } catch (IOException e) {
        e.printStackTrace();
        }

图像样本 上面写有文字的示例图像

也可以看看

我关注的一些有用的链接

如何在 Java (Android) 中的图像上写入文本

在 Android 中生成带有自定义文本的图像

在从独立相机捕获的图像上绘制文本(时间戳)

4

1 回答 1

0

您的问题是您的应用程序允许的分配内存。当您将图像加载到位图变量(decodeFile 或 bitmap.copy)时,请尝试设置选项以降低图像质量。例如,当您执行 bitmap.copy 时,尝试设置如下选项:

bitmap.copy(Bitmap.Config.ARGB_4444, true);
于 2013-07-09T15:18:22.550 回答