मैं एक छवि का आकार कैसे बदल सकता हूं, जिसकी छवि गुणवत्ता अप्रभावित है?
मैं एक छवि का आकार कैसे बदल सकता हूं, जिसकी छवि गुणवत्ता अप्रभावित है?
जवाबों:
जैसा कि रकार कहती है, आप कुछ गुणवत्ता खोए बिना नहीं रह सकते, सबसे अच्छा आप सी # में कर सकते हैं:
Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
जब तक आप वेक्टर ग्राफिक्स नहीं कर रहे हैं, तब तक बिना किसी छवि गुणवत्ता को खोए कोई छवि बदलने का कोई तरीका नहीं है।
private static Image resizeImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
return (Image)b;
}
मेरा मानना है कि आप जो करना चाहते हैं, वह आपकी छवियों का "आकार बदलना / फिर से तैयार करना" है। यहाँ एक अच्छी साइट है जो निर्देश देती है और एक उपयोगिता वर्ग प्रदान करती है (जिसका उपयोग मैं भी करता हूँ):
http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx
जब तक आप आकार परिवर्तन नहीं करते हैं, आप रास्टर ग्राफिक्स के साथ ऐसा नहीं कर सकते।
आप अच्छी छानने और चौरसाई के साथ क्या कर सकते हैं बिना किसी ध्यान देने योग्य गुणवत्ता को खोए आकार बदलना है ।
आप छवि के DPI मेटाडेटा को भी बदल सकते हैं (यह मानते हुए कि यह कुछ है) जो बिल्कुल उसी पिक्सेल गणना को रखेगा, लेकिन यह बदल देगा कि छवि संपादकों ने इसे 'वास्तविक दुनिया' माप में कैसे माना है।
और बस सभी आधारों को कवर करने के लिए, यदि आप वास्तव में छवि का केवल फ़ाइल आकार और वास्तविक छवि आयाम नहीं चाहते हैं, तो मेरा सुझाव है कि आप छवि डेटा के दोषरहित एन्कोडिंग को देखें। इसके लिए मेरा सुझाव एक .png फ़ाइल के रूप में छवि को फिर से लिखना होगा (मैं विंडोज़ में छवियों के लिए एक मुफ्त ट्रांसकोडर के रूप में पेंट का उपयोग करता हूं। पेंट को छवि में लोड करें, नए प्रारूप में सहेजें)
आप कुछ गुणवत्ता खोए बिना एक छवि का आकार नहीं बदल सकते, सिर्फ इसलिए कि आप पिक्सेल की संख्या कम कर रहे हैं।
आकार ग्राहक पक्ष को कम न करें, क्योंकि ब्राउज़र छवियों को आकार देने का अच्छा काम नहीं करते हैं।
आपके द्वारा रेंडर करने से पहले या उपयोगकर्ता द्वारा इसे अपलोड करने से पहले आप जो कर सकते हैं, वह प्रोग्राम को आकार बदल सकता है।
यहाँ एक लेख है जो c # में ऐसा करने का एक तरीका बताता है: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx
देखें कि क्या आपको इस खुले स्रोत ASP.NET मॉड्यूल की गुणवत्ता आकार बदलने वाली छवि पसंद है । एक लाइव डेमो है, इसलिए आप इसे स्वयं के साथ गड़बड़ कर सकते हैं। यह ऐसे परिणाम देता है जो (मेरे लिए) फ़ोटोशॉप आउटपुट से अलग करना असंभव है। इसकी फ़ाइल आकार भी समान है - MS ने अपने JPEG एनकोडर पर एक अच्छा काम किया।
वहाँ कुछ है, संदर्भ आकार का संदर्भ, पता नहीं है कि क्या आप इसका उपयोग करने में सक्षम होंगे, लेकिन यह देखने लायक है, यह सुनिश्चित करने के लिए है
एक अच्छा वीडियो डेमो (मध्य की ओर बढ़ता हुआ) http://www.youtube.com/watch?v=vIFCV2spKtg
यहाँ कुछ कोड हो सकता है। http://www.semanticmetadata.net/2007/08/30/content-aware-image-resizing-gpl-implementation/
क्या वह ओवरकिल था? हो सकता है कि कुछ आसान फ़िल्टर हैं जो आप पिक्सेल को थोड़ा धुंधला करने के लिए एक बढ़े हुए चित्र पर लागू कर सकते हैं, आप उस पर गौर कर सकते हैं।
क्या आप बड़ा या छोटा आकार बदल रहे हैं? एक छोटे% या 2x, 3x जैसे बड़े कारक द्वारा? आप अपने आवेदन के लिए गुणवत्ता से क्या मतलब है? और किस प्रकार की छवियां - तस्वीरें, हार्ड-धार रेखा चित्र, या क्या? अपने स्वयं के निम्न-स्तरीय पिक्सेल पीस कोड लिखना या मौजूदा पुस्तकालयों (.net या जो भी हो) के साथ इसे जितना संभव हो उतना करने की कोशिश करना?
इस विषय पर ज्ञान का एक बड़ा निकाय है। प्रमुख अवधारणा प्रक्षेप है।
ब्राउज़िंग सिफारिशें:
* http://www.all-in-one.ee/~dersch/interpolator/interpolator.html
* http://www.cambridgeincolour.com/tutorials/image-interpolation.htm
* C # के लिए: https: //secure.codeproject.com/KB/GDI-plus/imageprocessing4.aspx?display=PrintAll&fid=3657&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=629945
* इस जावा-विशिष्ट है, लेकिन शैक्षिक हो सकता है - http: //today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html
यहाँ आप इस वर्ग में वॉटरमार्क कोड जोड़ सकते हैं:
public class ImageProcessor
{
public Bitmap Resize(Bitmap image, int newWidth, int newHeight, string message)
{
try
{
Bitmap newImage = new Bitmap(newWidth, Calculations(image.Width, image.Height, newWidth));
using (Graphics gr = Graphics.FromImage(newImage))
{
gr.SmoothingMode = SmoothingMode.AntiAlias;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(image, new Rectangle(0, 0, newImage.Width, newImage.Height));
var myBrush = new SolidBrush(Color.FromArgb(70, 205, 205, 205));
double diagonal = Math.Sqrt(newImage.Width * newImage.Width + newImage.Height * newImage.Height);
Rectangle containerBox = new Rectangle();
containerBox.X = (int)(diagonal / 10);
float messageLength = (float)(diagonal / message.Length * 1);
containerBox.Y = -(int)(messageLength / 1.6);
Font stringFont = new Font("verdana", messageLength);
StringFormat sf = new StringFormat();
float slope = (float)(Math.Atan2(newImage.Height, newImage.Width) * 180 / Math.PI);
gr.RotateTransform(slope);
gr.DrawString(message, stringFont, myBrush, containerBox, sf);
return newImage;
}
}
catch (Exception exc)
{
throw exc;
}
}
public int Calculations(decimal w1, decimal h1, int newWidth)
{
decimal height = 0;
decimal ratio = 0;
if (newWidth < w1)
{
ratio = w1 / newWidth;
height = h1 / ratio;
return height.To<int>();
}
if (w1 < newWidth)
{
ratio = newWidth / w1;
height = h1 * ratio;
return height.To<int>();
}
return height.To<int>();
}
}
यहां एक फोरम थ्रेड है जो कोड नमूने का एक C # छवि प्रदान करता है। आप C # में resampling करने के लिए GD लाइब्रेरी बाइंडरों में से एक का उपयोग कर सकते हैं ।