वर्तमान में मैं एक प्रणाली है कि एक बहुत बड़ी छवि को लोड पर काम कर रहा हूँ, कम से कम चौड़ाई x अजी> = 10.000.000 साथ पिक्सेल।स्मृति से बाहर बिटमैप से बचने के लिए कैसे जब यानी के लिए बहुत बड़ी छवि पर काम: 10.000.000 पिक्सेल और
लेकिन उपयोगकर्ता की अपलोड छवि का अनुपात आमतौर पर हमारे आवश्यकता अनुपात से मेल नहीं खाता है, इसलिए मुझे इसे उचित अनुपात में फसल करना है, लेकिन सिस्टम का उपयोग करते समय इसे फसल करने के लिए बिटमैप ड्रॉ करना, मुझे हमेशा SytemOutOfMemory अपवाद मिला।
मैं सही RectangleF लेकिन कोई भाग्य के साथ Bitmap.Clone और Graphic.DrawImage कोशिश की है।
वहाँ वैसे भी OutOfMemory अपवाद हो रही बिना यह कर या वहाँ System.Drawing पुस्तकालय के लिए किसी भी विकल्प इस कार्य को आसानी से किया जाना कर रहे हैं है?
उपयोगकर्ता अपलोड फ़ाइल से चित्र करने के लिए मेरा कोड:
var fileBinary = new byte[stream.Length];
stream.Read(fileBinary, 0, fileBinary.Length);
stream.Position = 0;
var fileExtension = Path.GetExtension(fileName);
using (Image image = Image.FromStream(stream, false, false))
{
//validation and check ratio
CropImage(image, PORTRAIT_RATIO, fileExtension);
}
और CropImage समारोह:
//Crop Image from center with predefine ratio
private byte[] CropImage(Image sourceImg, float ratio, string fileExtension)
var height = sourceImg.Height;
var width = sourceImg.Width;
var isPortrait = width < height;
RectangleF croppingRec = new RectangleF();
float positionX = 0;
float positionY = 0;
float cropHeight = (float)height;
float cropWidth = cropHeight * PORTRAIT_RATIO;
positionY = 0;
positionX = (width - cropWidth)/2;
if (cropWidth > width)
{
cropWidth = width;
cropHeight = cropWidth * (1/PORTRAIT_RATIO);
positionX = 0;
positionY = ((height - cropHeight)/2);
}
croppingRec.Width = cropWidth;
croppingRec.Height = cropHeight;
croppingRec.X = positionX;
croppingRec.Y = positionY;
Bitmap bmpImage = sourceImg as Bitmap;
Bitmap bmpCrop = bmpImage.Clone(croppingRec, bmpImage.PixelFormat);
bmpCrop.Save("D:/test" + fileExtension, ImageFormat.Jpeg);
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(bmpCrop, typeof(byte[]));
}
}
जांच http://imageresizing.net/ – jle
आप विशेष ध्वज कि (अधिकतम 2GB की अलग एकल सूची संग्रह के लिए) clr से स्मृति प्रतिबंध को हटा के साथ '64bit' एप्लिकेशन के रूप में संकलित करने के लिए कोशिश की थी? –
Tigran
10 लाख पिक्सल सामान्य रूप से एक समस्या नहीं है, आधे से एक अरब सैद्धांतिक अधिकतम है, लेकिन एक 32-बिट प्रक्रिया में आपको लगता है कि इससे पहले कि अच्छी तरह से गिर जाते हैं। आमतौर पर लगभग 25 मिलियन यदि आपका प्रोग्राम थोड़ी देर के लिए चल रहा है। आपके कोड में सबसे अधिक संभावना बग निपटान() को कॉल करना भूल रहा है, जब आप बिटमैप क्लास का उपयोग करते हैं तो यह एक रॉक-हार्ड आवश्यकता है और जिस तरह से बहुत से प्रोग्रामर इसके बारे में भूल जाते हैं। जब आप अपना कोड पोस्ट नहीं करते हैं तो कोई भी आपकी बग नहीं देख सकता है। –