c# - C#将单色图像(1bpp)转换为灰度图像(8bpp)
问题描述
我尝试将图像从 1bpp 转换为 8bpp:
BitmapData dstData = dstImage.LockBits(
new Rectangle(0, 0, dstImage.Width, dstImage.Height),
ImageLockMode.ReadWrite, dstImage.PixelFormat);
try
{
int width = srcData.Width;
int height = srcData.Height;
unsafe
{
byte* srcBase = (byte*)srcData.Scan0.ToPointer();
byte* dstBase = (byte*)dstData.Scan0.ToPointer();
int srcStride = srcData.Stride;
int dstStride = dstData.Stride;
for (int y = 0; y < height; y++)
{
ushort* src = (ushort*)(srcBase + y * srcStride);
ushort* dst = (ushort*)(dstBase + y * dstStride);
for (int x = 0; x < width; x++)
{
byte mask = (byte)(0x80 >> (x & 0x07));
*dst = ((*src) & mask) != 0 ? (ushort)255 : (ushort)0;
if (mask == 1)
{
src++;
}
dst++;
}
}
}
}
finally
{
dstImage.UnlockBits(dstData);
}
新图像不是预期的灰度图像。设置像素值的算法似乎是错误的。
解决方案
var src = srcBase + y * srcStride; var dst = dstBase + y * dstStride;
for (int x = 0; x < width; x++, dst++)
{
byte mask = (byte)(0x80 >> (x & 0x07));
*dst = ((*src) & mask) != 0 ? (byte)255 : (byte)0;
if (mask == 1)
{
src++;
}
}
推荐阅读
- mips - MIPS - 创建一个延迟,将 80MHz 处理器“调节”到 1Hz
- java - Spigot-API 将另一个世界放入 java 中的 World 对象
- php - 删除 OrderItem 元数据
- c++ - 如何从另一个范围访问 unistd 写入?
- php - Dropbox 链接显示我的 PHP 文件的代码,而不是执行它
- python - 有没有办法在 discord.py 的“on_raw_reaction_add”中使用“wait_for 消息”
- sql - Sql server 未在查询中使用嵌套 case 语句更新记录
- javascript - Javascript 销毁对象的当前实例
- excel - 如何在excel的IF语句中定义0:00:00
- gcc - 在 C++ 中解决静态库和共享库之间的依赖关系时有什么区别?