C#图像处理 如何使用内存法将彩色图像转换为灰度图像并保存到picturebox中!!!

taopei1994 2016-05-02 04:39:17
C#图像处理 我先打开一幅彩色图像到picturebox中,然后我想用内存法将这幅彩色图像(已经在picturebox)转换为灰度图像,并显示在同一个picturebox中 请问这怎么实现?(现在我可以进行打开一幅图片,将图片显示到picturebox中 ,以及我明白内存法的原理,但就是不能将图片用内存法转换为灰度图像并显示在picturebox中)
...全文
290 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
assky124 2016-05-04
  • 打赏
  • 举报
回复


            Bitmap bmp = new Bitmap(100, 100);
            using (Graphics g = Graphics.FromImage(bmp))
            {
                g.FillEllipse(Brushes.Red, new Rectangle(0, 0, 80, 80));
                g.FillRectangle(new SolidBrush(Color.FromArgb(128, Color.Green)), new Rectangle(20, 20, 80, 80));
            }
            e.Graphics.DrawImage(bmp, new Point(10, 10));

            //简单的
            ControlPaint.DrawImageDisabled(e.Graphics, bmp, 120, 10, Color.White);

            //用颜色矩阵
            System.Drawing.Imaging.ImageAttributes attr = new System.Drawing.Imaging.ImageAttributes();
            float[][] colorMatrixElements = { 
               new float[] {.33f,  .33f,  .33f,  0, 0},        // r = (r+g+b)/3
               new float[] {.33f,  .33f,  .33f,  0, 0},        // g = (r+g+b)/3
               new float[] {.33f,  .33f,  .33f,  0, 0},        // b = (r+g+b)/3
               new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
               new float[] {0,  0,  0,  0, 1}};    // 
            System.Drawing.Imaging.ColorMatrix matrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
            attr.SetColorMatrix(matrix);
            e.Graphics.DrawImage(bmp, new Rectangle(10, 120, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel, attr);

crystal_lz 2016-05-03
  • 打赏
  • 举报
回复

public static Bitmap GetDarkImage(Bitmap bmpSrc) {
    Bitmap bmp = bmpSrc.Clone(
        new Rectangle(0, 0, bmpSrc.Width, bmpSrc.Height),
        PixelFormat.Format24bppRgb      //以24位图像作为处理
        );
    BitmapData bmpData = bmp.LockBits(  //锁定位图
        new Rectangle(0, 0, bmp.Width, bmp.Height),
        ImageLockMode.ReadWrite, 
        bmp.PixelFormat                 
        );
    //计算大小 注意后面不是 width 因为会内存中系统会补齐
    byte[] byColorInfo = new byte[bmp.Height * bmpData.Stride];
    //将 rgb 数据拷贝到数组中去
    Marshal.Copy(bmpData.Scan0, byColorInfo, 0, byColorInfo.Length);
    for (int x = 0, xLen = bmp.Width; x < xLen; x++) {
        for (int y = 0, yLen = bmp.Height; y < yLen; y++) {
            byte byV = GetAvg(//自己写的一个计算平均值的方法
                byColorInfo[y * bmpData.Stride + x * 3],        //B
                byColorInfo[y * bmpData.Stride + x * 3 + 1],    //G
                byColorInfo[y * bmpData.Stride + x * 3 + 2]);   //R
            byColorInfo[y * bmpData.Stride + x * 3] =
                byColorInfo[y * bmpData.Stride + x * 3 + 1] =
                byColorInfo[y * bmpData.Stride + x * 3 + 2] = byV;
        }
    }
    Marshal.Copy(byColorInfo, 0, bmpData.Scan0, byColorInfo.Length);
    bmp.UnlockBits(bmpData);    //操作完拷贝回去解锁
    return bmp;
}
以前的一个 黑白处理的代码 写上了注释 你自己参考吧
john_QQ:2335298917 2016-05-02
  • 打赏
  • 举报
回复
使用指针最快,也很方便
taopei1994 2016-05-02
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
什么是 内存法?
我自己解决啦 谢谢你~~!!
taopei1994 2016-05-02
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
什么是 内存法?
图像处理中 我看资料的时候,上面提及C#图像处理的3种方法,一是提取像素法 二是内存法 三是指针法,这三种方法处理图像的速度不同,提取像素法速度最慢,指针法最快。我现在可以用提取像素法做到图像在picturebox中的 处理,但是用内存法不行
taopei1994 2016-05-02
  • 打赏
  • 举报
回复
图像处理中 我看资料的时候,上面提及C#图像处理的3种方法,一是提取像素法 二是内存法 三是指针法,这三种方法处理图像的速度不同,提取像素法速度最慢,指针法最快。我现在可以用提取像素法做到图像在picturebox中的 处理,但是用内存法不行
xuzuning 2016-05-02
  • 打赏
  • 举报
回复
什么是 内存法?

110,536

社区成员

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

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

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