क्या छवि के आकार पर कोई सीमा है जिसे .NET से उपलब्ध छवि फ़ाइल कोडेक्स का उपयोग करके एन्कोड किया जा सकता है?.NET GDI + छवि आकार - फ़ाइल कोडेक सीमाएं
मैं छवियों को 4 जीबी आकार में एन्कोड करने की कोशिश कर रहा हूं, लेकिन यह बस काम नहीं करता है (या ठीक से काम नहीं करता है यानी एक अपठनीय फ़ाइल लिखता है) .bmp, .jpg, .png या .tif एन्कोडर्स के साथ।
जब मैं छवि आकार को < 2GB पर कम करता हूं तो यह .jpg के साथ काम करता है लेकिन .bmp, .tif या .png नहीं।
मेरा अगला प्रयास libtiff का प्रयास करना होगा क्योंकि मुझे पता है कि टिफ फाइलें बड़ी छवियों के लिए हैं।
बड़ी छवियों के लिए एक अच्छा फ़ाइल प्रारूप क्या है? या मैं सिर्फ फाइल प्रारूप सीमाओं को मार रहा हूँ?
(यह सब x64 वास्तुकला का प्रयोग डब्ल्यू रैम/8 जीबी एक 64 बिट ऑपरेटिंग सिस्टम (WinXP 64) पर किया जा रहा है और संकलित।)
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);
मैं भी एक पिन किए गए जीसी स्मृति का उपयोग की कोशिश की है क्षेत्र, लेकिन यह < 2 जीबी तक सीमित है।
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();
आप किस प्रोसेसर आर्किटेक्चर का उपयोग कर रहे हैं? –
@ रोवलैंड - x64 का उपयोग करके संकलित।तो 64 बिट। मुझे नहीं लगता कि इतनी बड़ी छवियों के लिए 32 बिट पर्याप्त होगा। मेरी मशीन में 8 जीबी रैम है, शायद यह पर्याप्त नहीं है हालांकि यह 4 जीबी से थोड़ा अधिक छवि के लिए होना चाहिए। मेरे पास लगभग 7 जीबी मुफ्त है, जब एन्कोडर वहां पर आता है तो अभी भी 1-2 जीबी मुफ्त है। –
@roygbiv बस स्पष्ट जांच रहा है :) –