2010-07-26 16 views
7

मैं निर्दिष्ट सीमाओं को फिट करने के लिए किसी छवि को डाउनसाइज़ करने के लिए एक फ़ंक्शन लिखना चाहता हूं। उदाहरण के लिए मैं 1280x800 में फिट करने के लिए 2000x2333 छवि का आकार बदलना चाहता हूं। पहलू अनुपात बनाए रखा जाना चाहिए। मैं निम्नलिखित कलन विधि ले कर आए हैं:छवि का आकार बदलना एल्गोरिदम

NSSize mysize = [self pixelSize]; // just to get the size of the original image 
int neww, newh = 0; 
float thumbratio = width/height; // width and height are maximum thumbnail's bounds 
float imgratio = mysize.width/mysize.height; 

if (imgratio > thumbratio) 
{ 
    float scale = mysize.width/width; 
    newh = round(mysize.height/scale); 
    neww = width; 
} 
else 
{ 
    float scale = mysize.height/height; 
    neww = round(mysize.width/scale); 
    newh = height; 
} 

और यह काम करने के लिए लग रहा था। अच्छा ... लग रहा था। लेकिन फिर मैंने 1280x1024 छवियों को 1280x800 सीमाओं में बदलने का प्रयास किया और इसने मुझे 1280x1024 का परिणाम दिया (जो स्पष्ट रूप से 1280x800 में फिट नहीं है)।

किसी के पास कोई विचार है कि इस एल्गोरिघ्म को कैसे काम करना चाहिए?

उत्तर

26

जिस तरह से मैं आमतौर पर ऐसा करता हूं वह मूल चौड़ाई और नई चौड़ाई और मूल ऊंचाई और नई ऊंचाई के बीच अनुपात के बीच अनुपात को देखना है।

इस छवि को सबसे बड़े अनुपात से कम करने के बाद। उदाहरण के लिए, यदि आप 800x600 छवि में 800x600 छवि का आकार बदलना चाहते हैं तो चौड़ाई अनुपात 2 होगा, और ऊंचाई अनुपात 1.5 होगा। 2 के अनुपात से छवि को हटाना 400x300 छवि देता है।

तुम्हें पता है कि या तो छवि की ऊंचाई या चौड़ाई बाउंडिंग बॉक्स के बराबर हो जाएगा:

NSSize mysize = [self pixelSize]; // just to get the size of the original image 
int neww, newh = 0; 
float rw = mysize.width/width; // width and height are maximum thumbnail's bounds 
float rh = mysize.height/height; 

if (rw > rh) 
{ 
    newh = round(mysize.height/rw); 
    neww = width; 
} 
else 
{ 
    neww = round(mysize.width/rh); 
    newh = height; 
} 
+0

ओह मैं 1280x800 करने के लिए 1280x1024 के अपने उदाहरण के कलाकारों के लिए जोड़ना चाहिए अनुपात 1 और 1.28 के बाद किया जाएगा, आकार परिवर्तन यह होगा 1000 x 800 – GWW

+0

धन्यवाद! मुझे लगता है कि यह आखिरकार काम करता है! – Marius

6

यहाँ समस्या दृष्टिकोण करने के लिए एक तरीका है।

एक बार जब आप यह निर्धारित कर लें कि कौन सा आयाम बाउंडिंग बॉक्स के बराबर होगा, तो आप अन्य आयाम की गणना करने के लिए छवि के पहलू अनुपात का उपयोग करते हैं।

double sourceRatio = sourceImage.Width/sourceImage.Height; 
double targetRatio = targetRect.Width/targetRect.Height; 

Size finalSize; 
if (sourceRatio > targetRatio) 
{ 
    finalSize = new Size(targetRect.Width, targetRect.Width/sourceRatio); 
} 
else 
{ 
    finalSize = new Size(targetRect.Height * sourceRatio, targetRect.Height); 
} 
+0

imageRatio क्या है? –

+0

@ जोनाथन एक्विनो मुझे लगता है कि 'SourceRatio' होना चाहिए था। अच्छा पिकअप –

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