我正在尝试从用户那里获取文本输入并将其绘制在图像上,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++; }目前,.drawText()基于我在其他 SO 帖子中看到的示例,我只有 2 个实现。我的假设是文本不可见,并且没有对图像进行任何更改,因为我没有为paint对象提供任何属性。
1 回答
跃然一笑
TA贡献1826条经验 获得超6个赞
您看不到任何更改的主要问题是您进行了更改mutableBitmap但将原始文件保存bitmap到磁盘。
这可以通过将前两个(甚至三个)语句连接在一起来避免:
final Bitmap bitmap = bitmapDrawable.getBitmap() .copy(Bitmap.Config.ARGB_8888, true);
您在其他任何地方都不需要原始位图,这有效地防止了您犯错。不要做你不需要做的事情。
一些技巧:
绘图时始终明确。指定颜色,指定字体。您不能信任默认值。(至少我不确定这些值。默认颜色是黑色还是透明?)
如果您想完全确定字体,请将其与您的应用程序捆绑在一起或使用可下载的字体。一些平台允许用户将默认字体更改为疯狂的东西。
如果您想绘制多行文本,请查看
StaticLayout.确保您的应用可在 Android 7 及更高版本上运行。禁止在您的应用之外发送带有文件 Uri 的意图。
添加回答
举报
0/150
提交
取消
