【发布时间】:2011-06-15 09:46:44
【问题描述】:
能否请人解释一下(ASCII 非常受欢迎)stride 参数在Canvas.drawBitmap() 和Bitmap.setPixels()/getPixels() 中代表什么?我知道这是一种跳过颜色数组中元素的方法,但是如何?
【问题讨论】:
标签: android canvas bitmap drawing
能否请人解释一下(ASCII 非常受欢迎)stride 参数在Canvas.drawBitmap() 和Bitmap.setPixels()/getPixels() 中代表什么?我知道这是一种跳过颜色数组中元素的方法,但是如何?
【问题讨论】:
标签: android canvas bitmap drawing
在大多数情况下,步幅与宽度相同。如果您尝试复制/绘制位图的子区域,则步幅很有用。例如,如果您有一个 100x100 的位图,并且要绘制 50x50 的右上角,则可以使用 50 像素的宽度和 100 像素的步幅。
【讨论】:
步幅是用于存储一个图像行的字节数。
步幅可以与图像宽度不同。
大多数图像都是 4 字节对齐的。
例如。宽度为 50 像素的 24 位 (RGB) 图像。所需的总字节数为 150 (3(RGB)*50)。 由于图像将是 4 字节对齐的,在这种情况下所需的字节将变为 152。
因此您将看到步幅为 152,宽度为 50,图像对齐为 4 个字节。
【讨论】:
这是一个很好的explanation from Microsoft,关于图像中通常的步幅。因此,用简单的英语来说,它定义了计算机扫描图像数据的步骤,直到它假定它位于下一行。
如果我理解正确,我也相信@Romain Guy 的示例还需要设置 x = 50 和 height = 50。
【讨论】:
我想问题是关于 Android、Java,而不是 Windows! 在这种情况下,stride 与“用于存储一个图像行的字节数”无关,这是一种 windows 命名法。
在理解参数“stride”之前,你需要知道getPixels是一个将像素从源Bitmap复制到目标数组(类型为int Pixels[])的函数。
关于复制,你需要知道来源(来自)在哪里,目的地(来)在哪里, 在功能上,
public void getPixels(int[] 像素, int offset, int stride, int x, int y, int width, int height) {
throw new RuntimeException("Stub!");
}
这4个参数控制来源:int x, int y, int width, int height
这 3 个参数控制目的地:int[] 像素、int 偏移量、int 步幅
例如你有一个宽度*高度 = 100*100Pixels 的 sourceImage,你制作了一个宽度 * 高度 = 200*100Pixels 的 destinationImage,并且你制作了以下代码,
sourceImage.getPixels(像素, 0, 2*wd, 0, 0, wd, ht); // 1号复制
sourceImage.getPixels(pixels, wd, 2*wd, 0, 0, wd, ht);// 2号复制
destinationImage = Bitmap.createBitmap(像素, 0, 2*wd, 2*wd, ht, Bitmap.Config.ARGB_8888); // 制作两倍于原图大小的大图像
对No.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 的大部分内容。
【讨论】: