使用图像中的特定像素格式在c#中创建位图而不加载图像

时间:2014-01-29 11:37:01

标签: c# image bitmap bmp pixelformat

抱歉,如果这个问题很愚蠢,我只是从C#开始

我在磁盘上有一个图像,我知道路径。图像尺寸为20000x10000 aprox,大小约为400MB(我知道这看图像)

我需要在代码中加载它并调整大小,因为如果我尝试将图像框放入400m的图像中,那么程序就会死掉,但如果我这样做了

        Bitmap b0 = new Bitmap(pathImage);
        int newWidth = (int)(b0.Width * escala);
        int newHeight = (int)(b0.Height * escala);

        // Convert other formats (including CMYK) to RGB.
        Bitmap newImage = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        // Draws the image in the specified size with quality mode set to HighQuality
        using (Graphics graphics = Graphics.FromImage(newImage))
        {
            graphics.CompositingQuality = CompositingQuality.HighQuality;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.DrawImage(b0, 0, 0, newWidth, newHeight);
        }

但是当我做Bitmap时b0 = new Bitmap(pathImage);它只是因为20000x10000x32而死,这对我糟糕的记忆来说太过分了。

问题是,如果没有指定,c#只使用像素格式Format32bppArgb,但我想要Format1bppIndexed,我发现改变格式的唯一方法是使用构造函数

位图(     整数宽度,     int高度,     int stride,     PixelFormat格式,     IntPtr scan0        )

但是对于这个构造函数,我需要知道图像的大小,这在代码中我不知道,因为它在代码可以获取并且知道大小之前就已经死了......

我迷路了。有什么想法吗?

编辑: 这样做 int width;

        int height;
        Image tif;
        using (FileStream file = new FileStream(rutaImagenEntrada, FileMode.Open, FileAccess.ReadWrite))
        {
            using ( tif = Image.FromStream(stream: file,
                                                useEmbeddedColorManagement: false,
                                                validateImageData: false))
            {
                width = (int)tif.PhysicalDimension.Width;
                height = (int)tif.PhysicalDimension.Height;

            }
            file.Close();
        }

我得到了无法加载的图像的大小,并且可以使用我想要的pixelformat和size创建一个位图,但是我尝试上传它不起作用,它仍然在我身上崩溃。 我尝试过使用图形.draw(tiff ...)和tiff.getThumbnail(新尺寸......)它就死了。 它针对的是x86和.Net 3.5,因为这些是客户端的要求......

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果FileStream正在打开文件,您可能想尝试一些Bitmap的其他构造函数,特别是Bitmap(Stream)

如果这没有帮助,您可以尝试加载原始bmp数据,创建一个具有所需格式的Bitmap并手动将数据复制到Bitmap中(我不熟悉C#Bitmaps,但应该有一些访问数据的方式。)

希望这有帮助。