方法一:直接修改RGB的值
首先将BitmapData扫描线上的所有像素复制到字节数组中,然后遍历数组并对每个像素的RGB值进行修改,最后将修改后的像素值复制回BitmapData。这个过程不会影响原始的Bitmap对象,但会改变锁定的位图区域的数据。当完成修改后,应调用UnlockBits()方法释放锁定的位图区域。
System.Drawing.Bitmap bitBufferRGB = new System.Drawing.Bitmap("彩色Bitmap图像.jpg");
System.Drawing.Imaging.BitmapData data = bitBufferRGB.LockBits(
new System.Drawing.Rectangle(System.Drawing.Point.Empty, bitBufferRGB.Size),
System.Drawing.Imaging.ImageLockMode.ReadWrite, bitBufferRGB.PixelFormat);
//获取内存
IntPtr pData = data.Scan0;
int bytes = data.Stride * bitBufferRGB.Height;
byte[] rgbValues = new byte[bytes];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(pData, rgbValues, 0, bytes);
for (int y = 0; y < bitBufferRGB.Height; y++)
{
for (int x = 0; x < bitBufferRGB.Width; x++)
{
// 获取像素(x, y)在数组中的索引。
int index = y * data.Stride + x * 3;
// 修改RGB值。
rgbValues[index] = (byte)(rgbValues[index] * 0.9); // 修改红色分量
rgbValues[index + 1] = (byte)(rgbValues[index + 1] * 0.7); // 修改绿色分量
rgbValues[index + 2] = (byte)(rgbValues[index + 2] * 0.9); // 修改蓝色分量
}
}
// Copy the modified RGB values back to the bitmap.
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, pData, bytes);
//解锁及释放资源
bitBufferRGB.UnlockBits(data);
bitBufferRGB.Dispose();
方法二:更换RGB的值位置
更换R和B的位置
System.Drawing.Bitmap bitBufferRGB = new System.Drawing.Bitmap("彩色Bitmap图像.jpg");
System.Drawing.Imaging.BitmapData data = bitBufferRGB.LockBits(
new System.Drawing.Rectangle(System.Drawing.Point.Empty, bitBufferRGB.Size),
System.Drawing.Imaging.ImageLockMode.ReadWrite, bitBufferRGB.PixelFormat);
//获取内存
IntPtr pData = data.Scan0;
int bytes = data.Stride * bitBufferRGB.Height;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(pData, rgbValues, 0, bytes);
for (int i = 0; i < height; i++)
{
for (int ji = 0; ji < width; ji++)
{
int index = i * width + ji;
// 每个像素占用三个字节
// 红色字节
rgbValues[index * 3] = System.Runtime.InteropServices.Marshal.ReadByte(pData, index * 3 + 2);
// 绿色字节
rgbValues[index * 3 + 1] = System.Runtime.InteropServices.Marshal.ReadByte(pData, index * 3 + 1);
// 蓝色字节
rgbValues[index * 3 + 2] = System.Runtime.InteropServices.Marshal.ReadByte(pData, index * 3);
}
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, pData, bytes);
//解锁及释放资源
bitBufferRGB.UnlockBits(data);
bitBufferRGB.Dispose();
文章来源地址https://www.toymoban.com/news/detail-816279.html
文章来源:https://www.toymoban.com/news/detail-816279.html
到了这里,关于C# 更改Bitmap图像色彩模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!