最近项目开发中遇到一个图像处理的关卡,如何将24位bitmap图像转换为8位bitmap图像。或者直接从保存24位真彩图的byte数组转换为保存8位灰图信息的byte数组。请各位大侠帮忙,多谢!
解决方案 »
- c#导出Excel进程去不掉问题
- C# SQL SERVER 2000在从服务器接收结果时发生传输级错误问题,
- 本机引用DLL,到别的机子上就失败了,怎么办?
- 如何获取某进程占用的CPU,内存等信息
- DateTimePicker控件显示下拉日历后,如何判断是否单击了下拉日历中左右两个月份导航按钮?
- 读文件的问题,高手过来看看
- 初学:web form控件 datagrid,header的高度,怎么不听使唤?
- 【求助】关于HttpWebRequest.Headers
- 高分求助,那有 Visual Studio.net下载啊????
- 读文件时的中文问题!
- 对.net的程序集签名,大家都有什么高见啊
- ASP.Net反射动态加载控件的问题
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();
}
}
}动手帮你写了一个代码,经测试通过.