WPF WriteableBitmap 跨距

 

跨距也就是Stride,意思是图像一行保存像素的字节数。

 

在写入WriteableBitmap 【可写位图】时,通常会用到跨距这个数值。

 

这个数值的计算与可写位图的像素格式和像素宽度有关。

 

WriteableBitmap wb = new WriteableBitmap(800, 800, 96, 96,PixelFormats.Bgra32, BitmapPalettes.WebPaletteTransparent);

 

也就是和PixelFormats格式有关。

 

例如 Bgr32 即为 每个像素占32位,排序顺序为B R G A每个通道8位比特,也就是每个通道一个Byte(字节),四个通道共4字节。

 

所谓的跨距就是要保证这一行是整数,且能容下一整行像素是像素宽度的字节数,但是要保证为4的倍数,且是向上舍入。

 

例如宽800,像素格式是Brga32,也就是4*800=3200字节数。

 

那么这个3200就是跨距。

 

byte[] colorData = { color.B, color.G, color.R, color.A };
wb.WritePixels(new Int32Rect((int)p.X, (int)p.Y, 1, 1), colorData,3200, 0);

 

换句说,这个跨距是像素位宽*像素宽度的数值,不一定是最小,理论上3200是稳妥的,6400也是可以的,就是内存变大了。

 

换做格式为Brg24,那么则是像素位占24位,每位8比特,共3字节。

 

理论跨距位 3*800=2400

 

但是像素宽度是 809;

 

跨距则是3*809=2427。注意,这里要保证是4的倍数。

 

2427%4 的 商为606,余数为3。不是4的倍数

 

此时的操作是向上加 1(代表加一个字节)即为 4*606+3+4%3=2428,相上加1的操作就是向上舍入了。

 

posted @ 2022-06-07 16:45  ARM830  阅读(291)  评论(1编辑  收藏  举报