c# - 修改 C# 颜色 int 或 uint 的一个字节

标签 c# pointers colors bitmap int

我在 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/

相关文章:

c# - 如何在 C# 中使用鼠标选择 PictureBox.Image 上的区域

c++ - 从函数返回时指针损坏

c - 如何在c中正确分配和打印结构指针?

c++指针比较器未编译

linux - 是给linux终端中的普通文本着色吗?

linux - Ghostscript 和 Pantone/专色

javascript - HTML1527 : DOCTYPE expected. 最短的有效文档类型是 "<!DOCTYPE html>"

c# - Clickonce - 在 DVD 上部署,使用离线安装程序

c# - 将绑定(bind)从 C# 转换为 XAML

php - RGB 到 HSL 函数中的饱和度计算不正确