java - Android canvas 不在我的位图上绘制文本

标签 java android android-canvas android-bitmap android-paint

我正在尝试从用户那里获取文本输入并使用 Canvas 将其绘制在图像上,但是保存的图像没有应该绘制的内容。现在,在我担心字体、颜色、样式等之前,我只是想在图像上获取文本。

这是我的代码:

 public void createBitmapAndSave(ImageView img){
        BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());
        Bitmap bitmap = bitmapDrawable.getBitmap();
        Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);

        Canvas canvas = new Canvas(mutableBitmap);
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setTextSize(200);
        paint.setStyle(Paint.Style.FILL);
        paint.setShadowLayer(10f, 10f, 10f, Color.BLACK);

        String topText = topTextView.getText().toString();
        String bottomText = bottomTextView.getText().toString();

        canvas.drawText(topText, 0, 0, paint);
        canvas.drawText(bottomText, 50, 50, paint);

        File file;
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
        file = new File(path + "/SimpliMeme/" + timeStamp + "-" + counter + ".jpg");
        file.getParentFile().mkdir();

        try{
            OutputStream stream = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
            stream.flush();
            stream.close();
            Toast.makeText(getContext(), "Meme Saved", Toast.LENGTH_SHORT).show();
        }
        catch (IOException e){ e.printStackTrace();}

        Uri contentUri = Uri.fromFile(file);
        mediaScanIntent.setData(contentUri);
        Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);
        counter++;
    }

目前,基于我在其他 SO 帖子中看到的示例,我只有 2 个 .drawText() 实现。我的假设是文本不可见并且没有对图像进行任何更改,因为我没有为 paint 对象提供任何属性。

最佳答案

您看不到任何更改的主要问题是您对 mutableBitmap 进行了更改,但将原始 bitmap 保存到磁盘。

这可以通过将前两个(甚至三个)语句连接在一起来避免:

final Bitmap bitmap = bitmapDrawable.getBitmap()
        .copy(Bitmap.Config.ARGB_8888, true);

您在其他任何地方都不需要原始位图,这有效地防止了您犯错误。不要做不需要做的事情。

一些提示:

关于java - Android canvas 不在我的位图上绘制文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54501031/

相关文章:

java - Selenium 和 Java 中的预期条件 "OR"

android - Recyclerview 行内的 GoogleMap

android - 通过 Facebook 问题登录 Parse

java - Android 上 SoundPool 的奇怪错误

java - 为什么 Java 在使用 lambda 泛型时选择 Object 参数化类型?

java - 我如何查看 Java 进行了哪些优化

Android Bitmap Masking (Xfermode) 留下不透明的黑色背景

android - 在我的半黑色 Canvas 上打一个透明洞

java - 自定义插件无法通过 QuerySpec 构造函数推断

android - 更新到 Android Studio 0.6.0 后 Canvas.drawRect() 停止绘制