मैं एएसपी.नेट एमवीसी (90 डिग्री वृद्धि में) से घूर्णन जेपीईजी छवियों का समर्थन करने का प्रयास कर रहा हूं। मैं System.Drawing
(जीडीआई +) का उपयोग करने का प्रयास कर रहा हूं, हालांकि मैं मुद्दों पर चल रहा हूं।गुणवत्ता के न्यूनतम नुकसान के साथ .NET में जेपीईजी घूर्णन
मैंने Image.RotateFlip
का उपयोग करने का प्रयास किया जो छवि को घुमाने में सक्षम है लेकिन गुणवत्ता का नुकसान होता है। 100 की एन्कोडर गुणवत्ता के साथ भी, घूर्णन वाली छवि पर अभी भी दिखाई देने वाली कलाकृतियां हैं जो मूल छवि पर नहीं थीं और न ही जब मैं इसे अन्य प्रोग्राम्स (गिंप इत्यादि) का उपयोग करके घुमाता हूं तो वे दिखाते हैं।
using (Image image = Image.FromFile("C:\\source.jpg")) {
ImageFormat sourceFormat = image.RawFormat;
image.RotateFlip(RotateFlipType.Rotate90FlipNone);
EncoderParameters encoderParams = null;
try {
if (sourceFormat == ImageFormat.Jpeg) {
encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
}
image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams);
} finally {
if (encoderParams != null)
encoderParams.Dispose();
}
}
मुझे transforming a JPEG without loss of information पर एक लेख मिला। का उपयोग करते हुए Encoder.Transformation
नेट से एक विकल्प हो गया लगता है - लेकिन मैं इसे अपने जेपीईजी परीक्षण छवियों के किसी भी कारण सब पर बारी बारी से करने, या नहीं, आयाम 16.
using (Image image = Image.FromFile("C:\\source.jpg")) {
ImageFormat sourceFormat = image.RawFormat;
EncoderParameters encoderParams = null;
try {
if (sourceFormat == ImageFormat.Jpeg) {
encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Transformation,
(long)EncoderValue.TransformRotate90);
}
image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams);
} finally {
if (encoderParams != null)
encoderParams.Dispose();
}
}
की एक बहु किसी को भी पता है कर रहे हैं करने के लिए नहीं मिल सकता है उपर्युक्त विधियों या किसी अन्य विधि का उपयोग करके न्यूनतम या न्यूनतम गुणवत्ता के साथ 90 डिग्री वृद्धि में .NET में एक जेपीईजी को सफलतापूर्वक घुमाने के लिए कैसे? धन्यवाद।
इसके अलावा, यहां GetEncoder
की मेरी कार्यान्वयन है:
private ImageCodecInfo GetEncoder(ImageFormat format) {
foreach (var info in ImageCodecInfo.GetImageEncoders())
if (info.FormatID == format.Guid)
return info;
return null;
}
संपादित करें:
मैं ऊपर कोड बेहतर अपने वास्तविक कोड के लिए अपडेट कर। बग निम्न पंक्ति में था:
if (sourceFormat == ImageFormat.Jpeg) {
यह किया जाना चाहिए था:
if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) {
आपका कोड मेरे लिए काम करता है .. क्या आप वाकई अपने डेटा के लिए ImageCodecInfo वापस आ गए हैं? –
धन्यवाद @pb, मुझे एक ImageCodecInfo मिल रहा था लेकिन एक एन्कोडर पैराम नहीं था क्योंकि मेरे वास्तविक कोड में एक बग था, इसे सेट करने से पहले एक अतिरिक्त जांच थी। –