Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#/GDI+中从格式8BPP转换为格式24BPPRGB;_C#_Gdi+ - Fatal编程技术网

在C#/GDI+中从格式8BPP转换为格式24BPPRGB;

在C#/GDI+中从格式8BPP转换为格式24BPPRGB;,c#,gdi+,C#,Gdi+,好的,我有一个来自外部应用程序的8位索引格式的图像。我需要这个图像转换成24位格式的大小完全相同 我尝试创建一个相同大小、格式为24bpprgb的新位图,然后使用图形对象在其上绘制8位图像,然后将其保存为Bmp。这种方法不会出错,但当我打开生成的图像时,BMP标题有各种各样的时髦值。高度和宽度都很大,此外,压缩标志和其他一些标志的值也很有趣(而且很大)。不幸的是,我的特殊要求是将这个文件传递给一个特定的打印机驱动程序,该驱动程序需要一个具有特定头文件值的24位图像(我正试图通过GDI+实现这一点

好的,我有一个来自外部应用程序的8位索引格式的图像。我需要这个图像转换成24位格式的大小完全相同

我尝试创建一个相同大小、格式为24bpprgb的新位图,然后使用图形对象在其上绘制8位图像,然后将其保存为Bmp。这种方法不会出错,但当我打开生成的图像时,BMP标题有各种各样的时髦值。高度和宽度都很大,此外,压缩标志和其他一些标志的值也很有趣(而且很大)。不幸的是,我的特殊要求是将这个文件传递给一个特定的打印机驱动程序,该驱动程序需要一个具有特定头文件值的24位图像(我正试图通过GDI+实现这一点)

有人知道将索引文件“上转换”为未索引的24位文件的示例吗?如果不是一个例子,我应该从哪条路开始写我自己的

-凯文·格罗斯尼克劳斯
kvgros@sseinc.com

奇怪的是,您正在创建一个与输入相同宽度和高度的位图,但生成的BMP要大得多。您可以发布一些代码吗?

问题可能是源图像和输出图像的垂直和水平分辨率之间的差异。如果加载分辨率为72 DPI的8bpp索引位图,然后创建一个新的24bpp位图(默认分辨率为96 DPI…至少在我的系统上是这样),然后使用Graphics.DrawImage将其剪切到新位图,则图像将显示为略微放大和剪切

话虽如此,我不知道如何正确创建输出位图和/或图形对象,以便在保存时正确缩放。我怀疑这可能与使用普通刻度(如英寸)而不是像素来创建图像有关。

我使用下面的代码将图像从8bpp“上转换”为24bpp。使用十六进制编辑器检查生成的24bpp文件,并与8bpp文件进行比较,结果显示两个文件的高度和宽度没有差异。也就是说,8bpp映像为1600x1200,而24bpp映像具有相同的值

    private static void ConvertTo24(string inputFileName, string outputFileName)
    {
        Bitmap bmpIn = (Bitmap)Bitmap.FromFile(inputFileName);

        Bitmap converted = new Bitmap(bmpIn.Width, bmpIn.Height, PixelFormat.Format24bppRgb);
        using (Graphics g = Graphics.FromImage(converted))
        {
            // Prevent DPI conversion
            g.PageUnit = GraphicsUnit.Pixel
            // Draw the image
            g.DrawImageUnscaled(bmpIn, 0, 0);
        }
        converted.Save(outputFileName, ImageFormat.Bmp);
    }

标题中的所有其他内容看起来都很合理,并且图像在我的系统上显示相同。你看到了什么“时髦的价值观”?

这是我的转换代码。请注意源图像和结果图像之间的分辨率匹配

    private void ConvertTo24bppPNG(Stream imageDataAsStream, out byte[] data)
    {
        using ( Image img = Image.FromStream(imageDataAsStream) )
        {
            using ( Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb) )
            {
                // ensure resulting image has same resolution as source image
                // otherwise resulting image will appear scaled
                bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);

                using ( Graphics gfx = Graphics.FromImage(bmp) )
                {
                    gfx.DrawImage(img, 0, 0);
                }

                using ( MemoryStream ms = new MemoryStream() )
                {
                    bmp.Save(ms, ImageFormat.Png);
                    data = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(data, 0, (int) ms.Length);
                }
            }
        }
    }

您可能需要包括g.PageUnit=GraphicsUnit.Pixel,以确保它逐像素绘制,而不是进行DPI转换(默认情况下,DrawImage会进行DPI转换)。@Chris:谢谢您的提示。吉姆:我想补充一点,厄尔兰多关于设定决议的建议有时是必要的,以确保结果确实没有改变(我今天碰到了这样的情况)。