किसी भी गुणवत्ता को खोए बिना एक छवि का आकार बदलना [बंद]


108

मैं एक छवि का आकार कैसे बदल सकता हूं, जिसकी छवि गुणवत्ता अप्रभावित है?


क्या आप हमें अधिक जानकारी दे सकते हैं? आपकी छवियां कितनी बड़ी हैं, और आपको उन्हें किस आकार की आवश्यकता है?
मार्क रैनसम


6
imageresizing.net - यह लाइब्रेरी .NET के साथ आपके द्वारा प्राप्त की जा सकने वाली उच्चतम-गुणवत्ता वाली छवियां बनाती है
Lilith River

जवाबों:


217

जैसा कि रकार कहती है, आप कुछ गुणवत्ता खोए बिना नहीं रह सकते, सबसे अच्छा आप सी # में कर सकते हैं:

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));
}

2
मैं यह जोड़ सकता हूं कि (यदि संभव हो तो) उपयोगकर्ता को एक बिटमैप छवि के साथ शुरू करना चाहिए, जो कहती है, दो बार जितनी बड़ी होनी चाहिए, उतनी बड़े पैमाने पर होनी चाहिए। परिणामी छवि बहुत चिकनी होनी चाहिए।
प्रेट्ज़ेल

2
gr.SmoothingMode = SmoothingMode.HighQuality बेहतर कोड है। वर्तमान में, HighQuality और AntAlias ​​एक ही चीज हैं, लेकिन शायद भविष्य में Microsoft कुछ नया आविष्कार करेगा। उच्चता हमेशा श्रेष्ठ के लिए एक उपनाम होना चाहिए।
ईयाल

4
विधि 'System.Drawing.Image.Save (स्ट्रिंग फ़ाइल नाम, ImageFormat प्रारूप)' JPGs को गुणवत्ता 75 से बचाता है। छवि धुंधली थी और ग्राहक द्वारा स्वीकार्य नहीं थी। सहेजें (स्ट्रिंग फ़ाइल नाम, ImageCodecInfo एनकोडर, EncoderParameters encoderParams) का उपयोग करने के लिए गुणवत्ता का मुद्दा क्या तय किया गया था और 100 के करीब एक गुणवत्ता मूल्य निर्दिष्ट करें।
रीगा

3
यह कभी-कभी छवि की सीमा पर कलाकृतियों को छोड़ देता है ...
jjxtra

1
मैं इस का उपयोग कर सीमा पर कलाकृतियों था। कोई शर्करा
गोपीचंदर

32

जब तक आप वेक्टर ग्राफिक्स नहीं कर रहे हैं, तब तक बिना किसी छवि गुणवत्ता को खोए कोई छवि बदलने का कोई तरीका नहीं है।


1
जब तक आप इसका विस्तार नहीं कर रहे हैं ...
ब्लेयर कॉनरैड

आप किसी भी जानकारी को खोए बिना इसका विस्तार कर सकते हैं, लेकिन विभिन्न प्रकार के फिल्टर हैं जिनका आप उपयोग कर सकते हैं जो अलग-अलग परिणाम देते हैं - शून्य-ऑर्डर होल्ड, कम-पास, आदि
एडम रोसेनफील्ड

24
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;
}

से यहाँ


यह काम करता है, लेकिन क्रिश एरिकसो के जवाब के समान गुणवत्ता देता है। हालांकि आकार का उपयोग देखकर अच्छा लगा ...
सैम जोन्स

5

मेरा मानना ​​है कि आप जो करना चाहते हैं, वह आपकी छवियों का "आकार बदलना / फिर से तैयार करना" है। यहाँ एक अच्छी साइट है जो निर्देश देती है और एक उपयोगिता वर्ग प्रदान करती है (जिसका उपयोग मैं भी करता हूँ):

http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx


3

जब तक आप आकार परिवर्तन नहीं करते हैं, आप रास्टर ग्राफिक्स के साथ ऐसा नहीं कर सकते।

आप अच्छी छानने और चौरसाई के साथ क्या कर सकते हैं बिना किसी ध्यान देने योग्य गुणवत्ता को खोए आकार बदलना है ।

आप छवि के DPI मेटाडेटा को भी बदल सकते हैं (यह मानते हुए कि यह कुछ है) जो बिल्कुल उसी पिक्सेल गणना को रखेगा, लेकिन यह बदल देगा कि छवि संपादकों ने इसे 'वास्तविक दुनिया' माप में कैसे माना है।

और बस सभी आधारों को कवर करने के लिए, यदि आप वास्तव में छवि का केवल फ़ाइल आकार और वास्तविक छवि आयाम नहीं चाहते हैं, तो मेरा सुझाव है कि आप छवि डेटा के दोषरहित एन्कोडिंग को देखें। इसके लिए मेरा सुझाव एक .png फ़ाइल के रूप में छवि को फिर से लिखना होगा (मैं विंडोज़ में छवियों के लिए एक मुफ्त ट्रांसकोडर के रूप में पेंट का उपयोग करता हूं। पेंट को छवि में लोड करें, नए प्रारूप में सहेजें)


3

आप कुछ गुणवत्ता खोए बिना एक छवि का आकार नहीं बदल सकते, सिर्फ इसलिए कि आप पिक्सेल की संख्या कम कर रहे हैं।

आकार ग्राहक पक्ष को कम न करें, क्योंकि ब्राउज़र छवियों को आकार देने का अच्छा काम नहीं करते हैं।

आपके द्वारा रेंडर करने से पहले या उपयोगकर्ता द्वारा इसे अपलोड करने से पहले आप जो कर सकते हैं, वह प्रोग्राम को आकार बदल सकता है।

यहाँ एक लेख है जो c # में ऐसा करने का एक तरीका बताता है: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx


"ब्राउज़र छवियों को आकार देने का एक अच्छा काम नहीं करते हैं" - यह '08 में सच हो सकता था, लेकिन सौभाग्य से हम इस क्षेत्र में अब बहुत आगे हैं (पुराने IE संस्करणों के कारण धीरे-धीरे लुप्त होती)।
कैमिलो मार्टिन

2

देखें कि क्या आपको इस खुले स्रोत ASP.NET मॉड्यूल की गुणवत्ता आकार बदलने वाली छवि पसंद है एक लाइव डेमो है, इसलिए आप इसे स्वयं के साथ गड़बड़ कर सकते हैं। यह ऐसे परिणाम देता है जो (मेरे लिए) फ़ोटोशॉप आउटपुट से अलग करना असंभव है। इसकी फ़ाइल आकार भी समान है - MS ने अपने JPEG एनकोडर पर एक अच्छा काम किया।


खैर, जेपीईजी एक अपेक्षाकृत सरल प्रारूप है। गुणवत्ता के संदर्भ में संदर्भ कार्यान्वयन को हरा देने के लिए आप बहुत कुछ नहीं कर सकते हैं / फाइल कर सकते हैं क्योंकि अंत में यह सामान्य संपीड़न के साथ सिर्फ डीसीटी गुणांक है।
कैमिलो मार्टिन

1

वहाँ कुछ है, संदर्भ आकार का संदर्भ, पता नहीं है कि क्या आप इसका उपयोग करने में सक्षम होंगे, लेकिन यह देखने लायक है, यह सुनिश्चित करने के लिए है

एक अच्छा वीडियो डेमो (मध्य की ओर बढ़ता हुआ) http://www.youtube.com/watch?v=vIFCV2spKtg

यहाँ कुछ कोड हो सकता है। http://www.semanticmetadata.net/2007/08/30/content-aware-image-resizing-gpl-implementation/

क्या वह ओवरकिल था? हो सकता है कि कुछ आसान फ़िल्टर हैं जो आप पिक्सेल को थोड़ा धुंधला करने के लिए एक बढ़े हुए चित्र पर लागू कर सकते हैं, आप उस पर गौर कर सकते हैं।


मुझे संदेह है कि इसका मूल प्रश्न से कोई लेना-देना नहीं है, लेकिन मुझे इस तकनीक से प्यार है।
मैट क्रूशांक सेप

1

क्या आप बड़ा या छोटा आकार बदल रहे हैं? एक छोटे% या 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


1

यहाँ आप इस वर्ग में वॉटरमार्क कोड जोड़ सकते हैं:

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>();
        }

    }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.