最近项目开发中遇到一个图像处理的关卡,如何将24位bitmap图像转换为8位bitmap图像。或者直接从保存24位真彩图的byte数组转换为保存8位灰图信息的byte数组。请各位大侠帮忙,多谢!

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Imaging;namespace ConsoleApplication2
    {
        class Program
        {
            unsafe static void Main(string[] args)
            {
                Bitmap img = (Bitmap)Image.FromFile("G:\\照片\\DSC00118.JPG");
                Bitmap bit = new Bitmap(img.Width, img.Height, PixelFormat.Format8bppIndexed);
                BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                byte* bp = (byte*)data.Scan0.ToPointer();
                BitmapData data2 = bit.LockBits(new Rectangle(0, 0, bit.Width, bit.Height), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
                byte* bp2 = (byte*)data2.Scan0.ToPointer();
                for (int i = 0; i != data.Height; i++)
                {
                    for (int j = 0; j != data.Width; j++)
                    {
                        //0.3R+0.59G+0.11B
                        float value = 0.11F * bp[i * data.Stride + j * 3] + 0.59F * bp[i * data.Stride + j * 3 + 1] + 0.3F * bp[i * data.Stride + j * 3 +2];
                        bp2[i * data2.Stride + j] = (byte)value;                }
                }
                img.UnlockBits(data);
                bit.UnlockBits(data2);
                ColorPalette palette = bit.Palette;
                for (int i = 0; i != palette.Entries.Length; i++)
                {
                    palette.Entries[i] = Color.FromArgb(i, i, i);
                }
                bit.Palette = palette;
                bit.Save("F:\\bb.bmp",ImageFormat.Bmp);
                img.Dispose();
                bit.Dispose();
            }
        }
    }动手帮你写了一个代码,经测试通过.
      

  2.   

    哦,1楼不错,其实Drawing.Imaging类里已经有很多处理的方法,楼主细细研究,比VC++方便多了。
      

  3.   

    什么意思?什么去年的帖子和武术???弱弱问一句 “0.3R+0.59G+0.11B”  什么意思呢