我在磁盘上有一个图像,我知道路径。图像尺寸为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,因为这些是客户端的要求......
有什么想法吗?
答案 0 :(得分:1)
如果FileStream正在打开文件,您可能想尝试一些Bitmap的其他构造函数,特别是Bitmap(Stream)。
如果这没有帮助,您可以尝试加载原始bmp数据,创建一个具有所需格式的Bitmap并手动将数据复制到Bitmap中(我不熟悉C#Bitmaps,但应该有一些访问数据的方式。)
希望这有帮助。