c# - उच्च गुणवत्ता छवि स्केलिंग लाइब्रेरी




image image-processing (10)

मैं गुणवत्ता स्तर के साथ सी # में एक छवि को स्केल करना चाहता हूं जितना फ़ोटोशॉप करता है। क्या इस चीज को करने के लिए कोई सी # छवि प्रसंस्करण लाइब्रेरी उपलब्ध है?


Graphics.InterpolationMode के लिए अलग-अलग मानों को आज़माएं। जीडीआई + में उपलब्ध कई सामान्य स्केलिंग एल्गोरिदम उपलब्ध हैं। यदि इनमें से कोई आपकी ज़रूरत के लिए पर्याप्त है, तो आप बाहरी पुस्तकालय पर भरोसा करने के बजाय इस मार्ग पर जा सकते हैं।


आप जादू कर्नेल को आजमा सकते हैं। यह upscaling जब bicubic resample की तुलना में कम पिक्सेलेशन कलाकृतियों का उत्पादन करता है और यह डाउनस्कलिंग करते समय भी बहुत अच्छे परिणाम देता है। स्रोत कोड वेब साइट से सी # में उपलब्ध है।



इस मूल कोड स्निपेट आज़माएं:

private static Bitmap ResizeBitmap(Bitmap srcbmp, int width, int height )
{
    Bitmap newimage = new Bitmap(width, height);
    using (Graphics g = Graphics.FromImage(newimage))
           g.DrawImage(srcbmp, 0, 0, width, height);
    return newimage;
}

जब आप जीडीआई + का उपयोग कर छवि खींचते हैं तो यह मेरी राय में काफी अच्छी तरह से स्केल करता है। आप इसका उपयोग स्केल की गई छवि बनाने के लिए कर सकते हैं।

यदि आप अपनी छवि को जीडीआई + के साथ स्केल करना चाहते हैं तो आप ऐसा कुछ कर सकते हैं:

Bitmap original = ...
Bitmap scaled = new Bitmap(new Size(original.Width * 4, original.Height * 4));
using (Graphics graphics = Graphics.FromImage(scaled)) {
  graphics.DrawImage(original, new Rectangle(0, 0, scaled.Width, scaled.Height));
}

मेरे पास डॉक्टर जोन्स के जवाब के लिए कुछ सुधार हुआ है।

यह काम करता है कि छवि को आनुपातिक रूप से आकार देने के लिए कैसे करना चाहता था। यह मेरे लिए परीक्षण और काम किया।

कक्षा I के तरीकों को जोड़ा गया:

public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, Size size)
{
    return ResizeImage(image, size.Width, size.Height);
}


public static Size GetProportionedSize(Image image, int maxWidth, int maxHeight, bool withProportion)
{
    if (withProportion)
    {
        double sourceWidth = image.Width;
        double sourceHeight = image.Height;

        if (sourceWidth < maxWidth && sourceHeight < maxHeight)
        {
            maxWidth = (int)sourceWidth;
            maxHeight = (int)sourceHeight;
        }
        else
        {
            double aspect = sourceHeight / sourceWidth;

            if (sourceWidth < sourceHeight)
            {
                maxWidth = Convert.ToInt32(Math.Round((maxHeight / aspect), 0));
            }
            else
            {
                maxHeight = Convert.ToInt32(Math.Round((maxWidth * aspect), 0));
            }
        }
    }

    return new Size(maxWidth, maxHeight);
}

और इस कोड के अनुसार उपयोग कर नया उपलब्ध है:

using (var resized = ImageUtilities.ResizeImage(image, ImageUtilities.GetProportionedSize(image, 50, 100)))
{
    ImageUtilities.SaveJpeg(@"C:\myimage.jpeg", resized, 90);
}


यह मदद कर सकता है

    public Image ResizeImage(Image source, RectangleF destinationBounds)
    {
        RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height);
        RectangleF scaleBounds = new RectangleF();

        Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height);
        Graphics graph = Graphics.FromImage(destinationImage);
        graph.InterpolationMode =
            System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        // Fill with background color
        graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds);

        float resizeRatio, sourceRatio;
        float scaleWidth, scaleHeight;

        sourceRatio = (float)source.Width / (float)source.Height;

        if (sourceRatio >= 1.0f)
        {
            //landscape
            resizeRatio = destinationBounds.Width / sourceBounds.Width;
            scaleWidth = destinationBounds.Width;
            scaleHeight = sourceBounds.Height * resizeRatio;
            float trimValue = destinationBounds.Height - scaleHeight;
            graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight);
        }
        else
        {
            //portrait
            resizeRatio = destinationBounds.Height/sourceBounds.Height;
            scaleWidth = sourceBounds.Width * resizeRatio;
            scaleHeight = destinationBounds.Height;
            float trimValue = destinationBounds.Width - scaleWidth;
            graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height);
        }

        return destinationImage;

    }

InterpolationMode.HighQualityBicubic नोट करें -> यह आम तौर पर प्रदर्शन और परिणामों के बीच एक अच्छा व्यापार है।


कोड प्रोजेक्ट पर जीडीआई + का उपयोग करने के बारे में कोड प्रोजेक्ट पर एक लेख है, जिसका उपयोग फोटो रीसाइजिंग करने के लिए करें, बाइबिक इंटरपोलेशन का उपयोग करके।

इस विषय के बारे में एक और ब्लॉग (एमएस कर्मचारी, मुझे लगता है) पर एक और लेख भी था, लेकिन मुझे कहीं भी लिंक नहीं मिल रहा है। :( शायद कोई और इसे पा सकता है?


Imagemagick और GD जैसे परीक्षण किए गए पुस्तकालय .NET के लिए उपलब्ध हैं

आप बाइबिक इंटरपोलेशन जैसी चीजों पर भी पढ़ सकते हैं और अपना खुद का लिख ​​सकते हैं।







image-scaling