我在 C# 中处理位图,如您所知,位图通常在内存中存储为 24bpp 或 32bpp(锁定时)。提取一个像素的int颜色值后,我需要一次读取一个字节来得到R、G、B,编辑相同的字节分别修改RGB。有没有办法使用指针修改 4 字节 32 位 int 的任何给定字节?或者我可以创建一个 struct
并将 int 转换为允许访问/修改单个字节的结构?
int color = 0xFFAABB
// attempt to read individual bytes of an int
int R = *((*color));
int G = *((*color)+1);
int B = *((*color)+2);
// attempt to modify individual bytes of an int
*((*color)) = R;
*((*color)+1) = G;
*((*color)+2) = B;
我需要这样一种方法来快速读取/写入单个字节。如果有一个 unsafe
方法可以处理这样的指针,我也不介意。我无法将每个像素转换为 Color
对象,因为它对于高速图像处理来说太慢了。
最佳答案
通常我所做的是按照您所说的那样创建一个结构:
public struct Pixel {
public byte Blue;
public byte Green;
public byte Red;
public byte Alpha;
}
然后我有一个实用函数,例如:
public void SetPixel(int x, int y, Pixel colour) {
Pixel* pixel = GetPixelAt(x, y);
*pixel = colour;
}
public Pixel* GetPixelAt(int x, int y) {
return (Pixel*)((byte*)_bitmapData.Scan0.ToPointer() + y * _width + x * sizeof(Pixel));
}
那么你可以这样调用它:
Pixel p;
p.Red = 255;
p.Green = 0;
p.Blue = 0;
p.Alpha = 255;
SetPixel(0, 0, p);
_bitmapData
是通过 LockBits
返回的 BitmapData
结构。
编辑:
来自评论。这就是您转换它们的方式:
// from pixel to int
Pixel p;
p.Red = 0;
p.Green = 0;
p.Blue = 0;
p.Alpha = 0;
int* i = (int*)&p;
// from int to pixel
Pixel p2;
p2 = *(Pixel*)&i;
未经测试,但应该没问题。
关于c# - 修改 C# 颜色 int 或 uint 的一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14412364/