drawBitmap()和setPixels():有什么步伐?

时间:2011-01-25 18:29:13

标签: android canvas bitmap drawing

可以请某人解释一下(我非常欢迎ASCII)stride参数在Canvas.drawBitmap()Bitmap.setPixels()/getPixels()中的含义是什么?我理解这是跳过colors数组中元素的一种方法,但是如何?

4 个答案:

答案 0 :(得分:19)

在大多数情况下,步幅与宽度相同。如果您尝试复制/绘制位图的子区域,则步幅很有用。例如,如果您有一个100x100的位图,并且想要绘制50x50的右上角,则可以使用50px的宽度和100px的步幅。

答案 1 :(得分:19)

Stride是用于存储一个图像行的字节数。

步幅可能与图像宽度不同。

大多数图像都是4字节对齐的。

对于前。宽度为50像素的24位(RGB)图像。所需的总字节数为150(3(RGB)* 50)。 由于图像将是4字节对齐的,在这种情况下,所需的字节将变为152。

因此,您将看到步幅为152,宽度为50,图像对齐为4字节。

答案 2 :(得分:0)

关于图像中的一般步幅,这是一个很好的explanation from Microsoft。因此,用简单的英语,它定义了计算机扫描图像数据的步数,直到它假定它在下一行。

我也相信@Romain Guy的例子如果我理解正确的话,还需要设置x = 50和height = 50.

答案 3 :(得分:0)

我想这个问题是关于Android,java而不是Windows! 在这种情况下,跨步与“用于存储一个图像行的字节数”无关,这是Windows的命名法。

在理解参数“ stride”之前,您需要知道getPixels是一个将像素从源位图复制到目标数组(类型为int Pixels [])的函数。

关于复制,您需要知道来源(来源)和目的地(来源), 功能上

public void getPixels(int []像素,整数偏移量,整数步幅,整数x,整数y,整数宽度,整数高度){

throw new RuntimeException("Stub!");

}

这4个参数控制着来源:int x,int y,int宽度,int高度

这3个参数控制着目的地:int []像素,int偏移量,int跨度

例如您有一个width * height = 100 * 100Pixels的sourceImage,您制作了一个width * height = 200 * 100Pixels的destinationImage,然后执行以下代码,

sourceImage.getPixels(pixels,0,2 * wd,0,0,wd,ht); // 1号复制

sourceImage.getPixels(pixels,wd,2 * wd,0,0,wd,ht); //第2次复制

destinationImage = Bitmap.createBitmap(pixels,0,2 * wd,2 * wd,ht,Bitmap.Config.ARGB_8888); //制作两倍于原始尺寸的大图像

对于第1个复制getPixels的解释如下,

读取1行:线宽= wd,并将其放入Pixels [0]〜Pixels [wd-1];

2行读取:放入Pixels [stride + 0]〜Pixels [stride + wd-1];

第n行读取:将其放入Pixels [(n-1)* stride]〜Pixels [(n-1)* stride + wd-1]。

几乎是getPixels的全部。