gpt4 book ai didi

.NET GDI+ 图像大小 - 文件编解码器限制

转载 作者:行者123 更新时间:2023-12-03 18:11:13 25 4
gpt4 key购买 nike

可以使用 .NET 提供的图像文件编解码器编码的图像大小是否有限制?

我正在尝试对大于 4GB 的图像进行编码,但它根本无法使用 .bmp、.jpg、.png 或 .tif 编码器工作(或无法正常工作,即写出不可读的文件)。

当我将图像大小降低到 < 2GB 时,它确实适用于 .jpg,但不适用于 .bmp、.tif 或 .png。

我的下一个尝试是尝试 libtiff,因为我知道 tiff 文件适用于大图像。

什么是大图像的好文件格式?或者我只是达到了文件格式限制?

(所有这些都是在 64 位操作系统 (WinXP 64) 上完成的,具有 8 GB 的 RAM,并使用 x64 架构编译。)

Random r = new Random((int)DateTime.Now.Ticks);

int width = 64000;
int height = 64000;
int stride = (width % 4) > 0 ? width + (width % 4) : width;
UIntPtr dataSize = new UIntPtr((ulong)stride * (ulong)height);
IntPtr p = Program.VirtualAlloc(IntPtr.Zero, dataSize, Program.AllocationType.COMMIT | Program.AllocationType.RESERVE, Program.MemoryProtection.READWRITE);

Bitmap bmp = new Bitmap(width, height, stride, PixelFormat.Format8bppIndexed, p);
BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);

ColorPalette cp = bmp.Palette;
for (int i = 0; i < cp.Entries.Length; i++)
{
cp.Entries[i] = Color.FromArgb(i, i, i);
}
bmp.Palette = cp;

unsafe
{
for (int y = 0; y < bd.Height; y++)
{
byte* row = (byte*)bd.Scan0.ToPointer() + (y * bd.Stride);
for (int x = 0; x < bd.Width; x++)
{
*(row + x) = (byte)r.Next(256);
}
}
}

bmp.UnlockBits(bd);
bmp.Save(@"c:\test.jpg", ImageFormat.Jpeg);
bmp.Dispose();

Program.VirtualFree(p, UIntPtr.Zero, 0x8000);

我也尝试过使用固定 GC 内存区域,但这仅限于 < 2GB。
Random r = new Random((int)DateTime.Now.Ticks);

int bytesPerPixel = 4;
int width = 4000;
int height = 4000;
int padding = 4 - ((width * bytesPerPixel) % 4);
padding = (padding == 4 ? 0 : padding);
int stride = (width * bytesPerPixel) + padding;
UInt32[] pixels = new UInt32[width * height];
GCHandle gchPixels = GCHandle.Alloc(pixels, GCHandleType.Pinned);
using (Bitmap bmp = new Bitmap(width, height, stride, PixelFormat.Format32bppPArgb, gchPixels.AddrOfPinnedObject()))
{
for (int y = 0; y < height; y++)
{
int row = (y * width);
for (int x = 0; x < width; x++)
{
pixels[row + x] = (uint)r.Next();
}
}

bmp.Save(@"c:\test.jpg", ImageFormat.Jpeg);
}
gchPixels.Free();

最佳答案

您面临的问题很可能是 .NET Framework 中的以下限制:GC 堆中允许的最大对象大小为 2GB,即使在 64 位操作系统/构建上也是如此。

一些引用资料:link , link , link .

根据您的需要,使用像 TIFF 这样相对简单(未压缩)的格式,可能可以分部分生成图像,然后再合并这些部分。只是一个想法..

关于.NET GDI+ 图像大小 - 文件编解码器限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com