如何从 ARGB_8888 位图绘制位图

Posted

技术标签:

【中文标题】如何从 ARGB_8888 位图绘制位图【英文标题】:How to draw Bitmap from ARGB_8888 Bitmap 【发布时间】:2014-06-25 05:08:38 【问题描述】:

我在画布上绘制路径并创建透明位图,同时从透明位图保存和创建裁剪位图。

查看图片:

在这个我想我在画布上绘制路径,我正在创建透明位图,并根据 startX、lowestY 和 highestX、highestY

Bitmap cropBitmap =Bitmap.createBitmap(sourceBitmap,startX,lowestY,highestX,highestY);

当我裁剪位图时,我只想“测试”绘制裁剪位图。但它给出的是空位图。像这样

在红色框内,无论我在画布上绘制什么,我都想从透明位图中裁剪位图。

【问题讨论】:

查看 Bitmap.createBitmap(Bitmap, int, int, int, int) 的文档 是的,好像只有我从源位图创建位图。这不是一种方法吗?那么,从源位图创建新位图的方法是什么? 查看最后两个参数 我根据最高 X 和最高 Y 采用的最后 2 个参数在这里意味着我从最高 X 中减去开始X,从最高 Y 中减去最低 Y。例如:(highestX-startX) 和 (highestY-lowestY),我将结果值添加到最后 2 个参数中。就像我正在做的那样。 【参考方案1】:

您不能简单地创建一个透明位图,并假设位图范围内的任何内容都已成为它的一部分,这意味着像素是相同的。您的假设有两个问题,数字 1,透明位图无济于事,因为透明度用作透视位图,只有 alpha 值,数字 2,使用路径绘制的数据与位图的数据,您最初创建了一个没有颜色的位图,除了它是完全透明的。

以下是如何完成此类任务的正确方法的通用代码:

 class myDrawingView extends View() 
      // all your class members you initialize here
      @Override
      public void onDraw(Canvas canvas) 
          // get your width and height using startx, starty, highestx, highesty, lowesty
          Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
          canvas.setBitmap(buffer);
          canvas.drawPath(//draw your path here);
          invalidate();

      

称为缓冲区的位图,现在是您所有绘图的帧缓冲区,因此您可以绘制路径,并将在您定义的缓冲区上呈现。您会看到没有使用透明度,我们只是创建了一个没有分配像素的位图,一旦您通过画布绘制到它,您的位图像素将是您绘制的任何内容。

【讨论】:

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

Android ARGB_8888 转 RGB

android的canvas如何转换为一张bitmap(位图)

分享上次保存的位图

如何从 ARGB 帧渲染视频

从 SurfaceView 获取位图

UWP 手绘视频创作工具技术分享系列 - 位图的绘制