gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:19:44 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com