【问题标题】:convert a greyscale image into rgb image using c#使用c#将灰度图像转换为rgb图像
【发布时间】:2018-08-10 05:04:13
【问题描述】:

您好,我有一个灰度 jpeg 图像,我需要打开它并将其转换为 rgb。 我需要最快的方法,但我一直找不到。 对我来说,用灰度值填充 rgb 值很好。只是使用 setpixel 和 getpixel 需要一段时间。 我想知道是否有我忽略的最快方法。

在网络上有很多将 rgb 转换为灰度的解决方案,但很难找到相反的解决方案。

我尝试过使用 FormatConvertedBitmap 但我只是得到错误我不知道如何 正确使用它。如果这是解决方案,请谁能给我写代码以从 jpeg 文件加载灰度图像,然后创建 rgb 位图?

提前致谢!!!

【问题讨论】:

  • 进行图像处理的最快方法是使用字节数据而不是嵌入的 SetPixel 方法。如果您想从中获得彩色图像,那么准确的结果实际上是不可能的。有许多组合可以导致单个灰度图像。如果您只想要一张包含所有三种颜色的像素数据的图像并且您接受灰度值,那么它应该非常容易。看看这里:stackoverflow.com/a/2016509/4871566
  • 据我所知,一旦图像以灰度保存,就无法推断出原始颜色值。
  • 您可以创建一个相同大小的rgb图像并将灰度位图绘制到它上面。或者使用lockbits填写数据..
  • 这个问题非常不清楚,所以你只想要一个保存为灰度为 24 位或 32 位像素格式的位图?
  • 我的图片是8bit的。只有一个通道0-255。我需要一个只有三个通道R = G = B的灰度图像。我希望现在我已经消除了所有疑问。

标签: c# .net image rgb grayscale


【解决方案1】:

这个问题中有些东西没有明确说明,所以我在这里做一些假设。

我做的第一个假设是输入灰度图像没有 3 字节的 RGB 值来确定像素的颜色,相反我假设对于灰度图像中的每个像素,只有 1 个字节指定它在灰度中表示的色调。

这个,0代表黑色,255代表白色。

因为每个像素的 RGB 值有 1 个字节用于红色,1 个字节用于绿色,1 个字节用于蓝色(总共 3 个字节),因此无法将上述灰度图像转换为 RGB图片,因为没有足够的数据。

您可以做的是使用每个像素的灰度图像色调,并为所有三个 RGB 值设置此值。您仍然会得到灰度图像,但像素格式 (RGB) 不同。

编辑:我在研究如何解决这个问题后写了一些代码,它需要一个文件 C:\image\image1.bmp:

   //load input image (bitmap)
    Bitmap image1 = new Bitmap(@"C:\image\image1.bmp");

    //create output image (bitmap) and set the new pixel format
    Bitmap image2 = new Bitmap(image1.Width, image1.Height,
        System.Drawing.Imaging.PixelFormat.Format24bppRgb);

    //draw the input image on the output image within a specified rectangle (area)
    using (Graphics gr = Graphics.FromImage(image2)) {
        gr.DrawImage(image1, new Rectangle(0, 0, image2.Width, image2.Height));
    }

    //save output image
    image2.Save(@"C:\image\image2.bmp");

【讨论】:

  • 灰度图像,除非自从我学习图像处理以来情况发生了变化,如果没有指定,则与您所做的 8 位 1 单通道完全相同,其值从 0 到 255。所以既然您猜对了我不明白为什么这个问题在你眼中不清楚。你的建议是我想要避免的。我需要比这更快的东西。您的建议是为每个像素复制三个 RGB 值。在 c++ 中,我只需将数组值分配给三个通道,但在这里我只知道 setpixel 和 getpixel 可以做到这一点,这真的很慢。谢谢!
【解决方案2】:

无论如何,我的最终解决方案是添加压缩质量设置 就像帖子中解释的那样: High quality JPEG compression with c# 我会把它贴在下面,也许有人会觉得它有用:

ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder =  System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;

Bitmap orig = new Bitmap(@imageor); // imageor is the complete path of the original image

Bitmap clone = new Bitmap(orig.Width, orig.Height,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (Graphics gr = Graphics.FromImage(clone))
{
     gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
}
clone.Save(clonergb, jpgEncoder, myEncoderParameters); // clonergb is the complete path of the cloned jpeg RGB image

【讨论】:

    【解决方案3】:

    链接中提出的解决方案: stackoverflow.com/a/2016509/4871566 – DeveloperExceptionError 工作得很好。 感谢发帖的人!!!!!! 这是我的解决方案:

    Bitmap orig = new Bitmap(@imagenamecm);
                    //imagenamecm is the link to the 8bit-greyscale image
                    Bitmap clone = new Bitmap(orig.Width, orig.Height,
                        System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
    
                    using (Graphics gr = Graphics.FromImage(clone))
                    {
                        gr.DrawImage(orig, new Rectangle(0, 0, clone.Width, clone.Height));
                    }
                        clone.Save(imagenamecmrgb, System.Drawing.Imaging.ImageFormat.Jpeg);
                    //  imagenamecmrgb is the path for the greyscale rgb image
    

    【讨论】:

    • 请问为什么这是-2?这就是我的解决方案。如果版主可以跳到这里,我会很高兴。
    • 我并不感到惊讶;您正在将评论中发布的内容归功于您。另外,如果这解决了您的问题,那么这也意味着该问题是重复的;给定的问题具有完全相同的问题,即“如何在像素格式之间进行转换?”也就是说,人们真的应该将这些内容发布为自己的答案,而不是 cmets。
    • 我认为这里有很大的误解。
    • 请阅读我在代码之前写的内容。我发布它不是为了获得学分,而是为了感谢向我推荐链接的人。我不是编程方面的专家,也不是 stackoverflow 通信方面的专家。如果我在发布解决方案时冒犯了某人,我很抱歉,顺便说一下,我不得不进一步更改它,因为 jpeg 压缩会破坏我的图像。
    • 我没有投反对票。我只是在回答你的问题。
    猜你喜欢
    • 2018-08-15
    • 2014-02-26
    • 2014-12-22
    • 2019-11-14
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多