【求助】如何输出 8位 灰度图像

finando 2008-04-27 10:00:38

输入一个24位的RGB彩色图像,容易通过计算将其灰度化,但这只是视觉上灰度化了,如何存储成为8位的灰度图像??
使用了8bppindex 创建,但结果却成了具有256种彩色的图像。
...全文
282 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobai18630 2012-10-19
  • 打赏
  • 举报
回复
膜拜 牛逼人物,真的,我服了
finando 2008-04-29
  • 打赏
  • 举报
回复

多谢gomoku!!!很有帮助!!!
gomoku 2008-04-28
  • 打赏
  • 举报
回复
把颜色索引表置为灰阶就可以了,请参考所贴代码。

为代码清晰用了GetPixel(),它是很慢的函数。图像稍大一点建议用LockBit把图像放到系统内存中操作。亮度计算这里用了简单平均,你可以选择你认为合适的算法。


//...
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
//...

{
Bitmap bmp = new Bitmap("my.jpg");

// 每一扫描线必须是4 byte的倍数。
int stride = ((bmp.Width - 1) & 0x00FFFFFC) + 4;
byte[] intensities = new byte[ stride * bmp.Height];

// 把计算出来的亮度放到准备好的内存数组中
for(int y = 0; y<bmp.Height; y++)
{
for(int x = 0; x<bmp.Width; x++)
{
Color c = bmp.GetPixel(x,y);
intensities[y * stride + x] = (byte)((c.R + c.G + c.B) / 3);
}
}

// 构置一个8bit的索引图像,直接指定图像数据
GCHandle gch = GCHandle.Alloc(intensities, GCHandleType.Pinned);
Bitmap grayscale = new Bitmap(
bmp.Width,
bmp.Height,
stride,
PixelFormat.Format8bppIndexed,
gch.AddrOfPinnedObject());
gch.Free();

// 重置颜色索引表为灰阶
ColorPalette palette = grayscale.Palette;
for (int i = 0; i < palette.Entries.Length; i++)
{
palette.Entries[i] = Color.FromArgb(i, i, i);
}
grayscale.Palette = palette;

grayscale.Save("gray.bmp");
}
ganguozai 2008-04-27
  • 打赏
  • 举报
回复
8位图像本身就是256色啊(2的8次方不就是256么?)。
楼主的“ 使用了8bppindex 创建,但结果却成了具有256种彩色的图像。”应该不成问题呀!
onthebox 2008-04-27
  • 打赏
  • 举报
回复
用c++做过
C#不知道
并且读的是BMP格式

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧