在位图上绘制文本失败

Posted

技术标签:

【中文标题】在位图上绘制文本失败【英文标题】:draw text on top of bitmap failed 【发布时间】:2011-02-15 10:51:31 【问题描述】:

我想在图像上显示一个点和一个文本。我已经尝试了几个关于覆盖位图的教程,但它似乎不起作用。这是显示背景图像的代码。

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roomplan);
mIV = (ImageView)findViewById(R.id.ImageView01);
mIV.setImageBitmap(mBitmap); 
mIV.invalidate();

btnDraw = (Button)findViewById(R.id.Button01);
btnDraw.setOnClickListener(this);

然后在 OnClickListener 上,我定义另一个位图并绘制点和文本。

Bitmap bmOverlay = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), 
    Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(bmOverlay);
Paint paint = new Paint();
paint.setColor(Color.CYAN);
paint.setTextSize(20);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
canvas.drawText("You are here", 100, 100, paint);
canvas.drawPoint(30.0f, 50.0f, paint);
canvas.drawBitmap(bmOverlay, 0, 0, null);

即使我删除了图像,背景图像顶部也不会显示任何内容。请问有什么提示吗?

更新:工作代码

// get a reference to the background image
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.raumplan_isst);

mIV = (ImageView)findViewById(R.id.ImageView01);

// create a mutable bitmap with the same size as the background image
Bitmap bmOverlay = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), 
    Bitmap.Config.ARGB_4444);
// create a canvas on which to draw
canvas = new Canvas(bmOverlay);

Paint paint = new Paint();
paint.setColor(Color.CYAN);
paint.setTextSize(20);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);

// if the background image is defined in main.xml, omit this line
canvas.drawBitmap(mBitmap, 0, 0, null);
// draw the text and the point
canvas.drawPoint(fKoordX, fKoordY, paint);
canvas.drawText("You are here", fKoordX+3, fKoordY+3, paint);

// set the bitmap into the ImageView
mIV.setImageBitmap(bmOverlay);

【问题讨论】:

这很正常,您在绘制位图之前绘制文本并指向。当然你的位图会覆盖一切! 查看我的回答http://***.com/questions/7320392/how-to-draw-text-on-image/10313272#10313272 【参考方案1】:

你用画布做什么?它在哪里使用? (发布更多代码...)

除了绘图顺序错误之外,您正在过度绘制文本并使用位图指向。

编辑:

我有点迷茫,因为我不知道你的哪些图像应该是背景以及你已经看到了什么图像......所以我猜 mBitmap(房间平面图)是你的背景?将其作为背景图像添加到您的布局中,然后使用 ImageView 来绘制您的叠加层...

如果您的 Overlay 也需要背景图片,请尝试:

// overlay background
canvas.drawBitmap(myBmp, 0, 0, paint);
// draw the text and the point
canvas.drawText("You are here", 100, 100, paint);
canvas.drawPoint(30.0f, 50.0f, paint);

如果您的 ImageView 应该将房间平面图作为背景,请尝试:

// overlay background
canvas.drawBitmap(mBitmap, 0, 0, paint);
// draw the text and the point
canvas.drawText("You are here", 100, 100, paint);
canvas.drawPoint(30.0f, 50.0f, paint);

【讨论】:

就是这样。第一个代码在onCreate() 方法中,第二个代码在OnClickListener 中。好的,既然我得到了关于绘图顺序的相同答案,我会试着玩一下然后回复你;) 您需要在某处应用画布。画布是你绘制的地方,但它必须在 UI 的某个地方使用,因为当你不使用它时,它不会显示出来...... @WarrenFaith 是的,明白了。现在我可以看到要点和文字,但仍然没有叠加的运气。能给个提示吗? 当你看到点和文本时,你应该不难像绘制点和文本一样绘制位图,但在它之前。如果没有,请用你所拥有的更新问题,请 @WarrenFaith 我已经把修改后的代码。我看不到应该在哪里设置背景图片。

以上是关于在位图上绘制文本失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在位图上绘制粗体文本?

Android 在位图上绘制文本

如何使用 EaselJS 在位图上绘制/绘制线条?

在位图上绘制椭圆并返回带有椭圆的位图

绘制在位图上以一定角度旋转的线

c ++在位图上绘制图像并保存