2012-05-04 22 views
36

बनाए रखने के दौरान किसी दिए गए आकार में ड्रॉइंग। बिटमैप को किसी निश्चित चौड़ाई और ऊंचाई से कम से कम System.Drawing.Bitmap स्केल करना चाहते हैं। यह किसी वेबसाइट पर छवि गैलरी के लिए थंबनेल जेनरेट करना है, इसलिए मैं पहलू अनुपात को समान रखना चाहता हूं।पहलू अनुपात

मेरे पास कुछ समाधानों में कुछ है लेकिन कोई भी वास्तव में ऐसा करने की प्रतीत नहीं करता है जो मुझे चाहिए; वे चौड़ाई या ऊंचाई को समान रखने के आधार पर स्केलिंग के चारों ओर घूमते हैं लेकिन दोनों को नहीं बदलते हैं।

एक उदाहरण:

अगर मैं एक 4272 2848 छवि से और मैं 1024 x 768 का एक आकार करने के लिए इसे पैमाने पर करना चाहते हैं, तो जिसके परिणामस्वरूप छवि 1024 683 और गद्देदार द्वारा (एक काले रंग की सीमा के साथ) होना चाहिए 1024 से 768 तक।

मैं आवश्यक आकार की तुलना में बड़ी छवियों के साथ ऐसा कैसे कर सकता हूं और आकार और पैड छवियों की तुलना में छोटे से कैसे कर सकता हूं जो सटीक आकार में नहीं आते हैं जिन्हें मुझे एक बार स्केल किया जाता है?

+0

आप अन्य आयाम की गणना करने के लिए गणित क्यों नहीं कर सकते? –

+0

@ कोडीग्रे वास्तव में "अन्य" आयाम क्या है? यह एक 2 आयामी छवि है जिसे इसके पहलू अनुपात को बनाए रखते हुए स्केल किया जाना चाहिए। मैंने पहलू अनुपात को लेने और लक्ष्य आकार के करीब की चौड़ाई और ऊंचाई के लिए एक आम संप्रदाय का पता लगाने की कोशिश की है, और यह कभी भी सही काम नहीं करता है। –

उत्तर

38

लक्ष्य पैरामीटर:

float width = 1024; 
float height = 768; 
var brush = new SolidBrush(Color.Black); 

आपका मूल फ़ाइल:

var image = new Bitmap(file); 

लक्ष्य आकार (पैमाने कारक):

float scale = Math.Min(width/image.Width, height/image.Height); 

कैनवास brushing पहले सहित आकार:

var bmp = new Bitmap((int)width, (int)height); 
var graph = Graphics.FromImage(bmp); 

// uncomment for higher quality output 
//graph.InterpolationMode = InterpolationMode.High; 
//graph.CompositingQuality = CompositingQuality.HighQuality; 
//graph.SmoothingMode = SmoothingMode.AntiAlias; 

var scaleWidth = (int)(image.Width * scale); 
var scaleHeight = (int)(image.Height * scale); 

graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); 
graph.DrawImage(image, new Rectangle(((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight)); 

और परिणामस्वरूप फ़ाइल को सहेजने के लिए bmp.Save(filename) करना न भूलें।

+1

यह एक ठोस काले छवि बनाता है। –

+0

मेरे लिए पूरी तरह से काम करता है, तब तक डाउनवोट करने की आवश्यकता नहीं है जब तक आप सुनिश्चित न हों कि आपको समस्या मिली है। 'FillRectangle' लाइन को हटाएं और देखें कि आपको क्या मिलता है। बस फिर से परीक्षण किया और यह ठीक काम करता है। मैं .NET 4.0 पर हूं यदि इससे कोई फर्क पड़ता है। – yamen

+0

यदि लक्ष्य आयाम छवि के आयामों से कम दोनों हैं तो यह काम नहीं करता है। 'स्केल' 0.0 हो जाता है। यह पहलू अनुपात को भी सुरक्षित नहीं रखेगा, जो मैं बता सकता हूं। –

99

बिटमैप निर्माता में बनाया का आकार बदलना गया है।

Bitmap original = (Bitmap)Image.FromFile("DSC_0002.jpg"); 
Bitmap resized = new Bitmap(original,new Size(original.Width/4,original.Height/4)); 
resized.Save("DSC_0002_thumb.jpg"); 

http://msdn.microsoft.com/en-us/library/0wh0045z.aspx

आप नियंत्रण चाहते हैं अधिक प्रक्षेप मोड this post देखते हैं।

+2

धन्यवाद। इससे बहुत मदद मिली। मुझे पता है कि यह एक पुराना उत्तर है, लेकिन क्या कोई कारण है कि मेरी नई छवि अस्पष्ट दिख रही है? क्या मुझे कोई इंटरपोलेशन मोड सेट करने की ज़रूरत है? – theGreenCabbage

+1

क्या यह सिर्फ एक नए छोटे बिटमैप के अंदर मूल बिटमैप नहीं खींचता है? छवि का एक हिस्सा सिर्फ काटा जाना चाहिए। – DerpyNerd

+2

* क्या यह सिर्फ एक नए छोटे बिटमैप के अंदर मूल बिटमैप नहीं खींचता है? * टीएफएम का लिंक सही है: * निर्दिष्ट मौजूदा छवि से बिटमैप क्लास का एक नया उदाहरण आरंभ करता है, ** निर्दिष्ट आकार में स्केल किया गया ** * –

संबंधित मुद्दे