2009-03-06 11 views
7

बाउंडिंग उदाहरण के लिए भरने के लिए अगर मैं एक सीमांकन बॉक्स 50px लंबा, निम्न इनपुट छवियों से 100px चौड़ा है जो निम्न व्यवहार होता भरने की जरूरत है:स्केल छवि को पूरी तरह, बॉक्स

  1. 200w एक्स 200h हो जाता है 50% और को घटाया गया 25% शीर्ष पर कटा हुआ हो जाता है और नीचे।

  2. 200W x 100h कोई फसल के साथ 50% को घटाया जाता है।

  3. 100w x 200h gets स्केल नहीं किया गया है, लेकिन 75px ऊपर और नीचे कटा हुआ हो जाता है।

ऐसा लगता है कि यह एक सामान्य आकार बदलने वाला फ़ंक्शन होगा, लेकिन मैं एल्गोरिदम का एक उदाहरण ट्रैक करने में सक्षम नहीं हूं।

छद्म कोड सहित किसी भी भाषा में उत्तर स्वीकार करेगा। उत्तर के साथ एक पृष्ठ का एक लिंक भी महान है!

+0

किसी ने मेरे जवाब पर कोई टिप्पणी की, मैंने सोचा कि यह आप था, लेकिन यह नहीं है - क्या आप अपनी वास्तविक बाधाओं के बारे में प्रश्न को थोड़ा सा स्पष्ट कर सकते हैं? धन्यवाद। –

+0

सामान्य मामला वह है जो मैं चाहता था। धन्यवाद। – Larsenal

+0

धन्यवाद। मैंने अपने जवाब के भ्रामक आधे हिस्से को संपादित किया है। –

उत्तर

12

जो आप पूछ रहे हैं वह बहुत आसान है। चौड़ाई और ऊंचाई के लिए विभिन्न स्केलिंग कारकों की गणना करें, फिर अपने वास्तविक पैमाने कारक के लिए बड़ा चुनें। अपने इनपुट आकार को पैमाने से गुणा करें, और फसल जो भी बहुत बड़ी हो जाती है।

scale = max(maxwidth/oldwidth, maxheight/oldheight) 
scaledwidth = oldwidth * scale 
scaledheight = oldheight * scale 
if scaledheight > maxheight: 
    croptop = (scaledheight - maxheight)/2 
    cropbottom = (scaledheight - maxheight) - croptop 
if scaledwidth > maxwidth: 
    cropleft = (scaledwidth - maxwidth)/2 
    cropright = (scaledwidth - maxwidth) - cropleft 
+0

केवल एक्स (चौड़ाई) आकार बदलने की बाधाओं के तहत है। अन्य वाई (ऊंचाई) फसल है। – Suroot

+0

उस बाधा को नहीं बताया गया था, और न ही यह आपके उदाहरणों से स्पष्ट था। उस स्थिति में, इसके बजाय स्केल = maxwidth/oldwidth का उपयोग करें और क्रॉपफ्ट/फसलराइट गणनाओं को हटा दें, शेष वही रहता है। –

+0

क्या हमें आउटपुट संख्याओं को गोल करना चाहिए क्योंकि वे अक्सर पिक्सेल के अंश होते हैं? –

1

यहाँ हम यकीन है कि हम केवल पैमाने पर है कि यदि एक्स 100% से अधिक है; उसके बाद हमने यह सुनिश्चित करने के बाद, हम सुनिश्चित करते हैं कि हम अपने वाई पर केवल 50 पीएक्स हैं। यदि हम 50 से अधिक हैं, तो हम शीर्ष/नीचे से निकाली गई राशि प्राप्त करने के लिए अंतर लेते हैं और 2 से विभाजित करते हैं।

double percent_x = 1.0; 

if(X > 100) { 
percent_x = (float)100/X; 
X *= percent_x; 
Y *= percent_x; 
} 

int diff_y; 
int top_cut, bott_cut; 
if(Y > 50) { 
diff_y = (Y - 50)/2; 
top_cut = bott_cut = diff_y; 
} 
0

मोटे तौर पर मार्क Ransom के जवाब से प्रेरित (आप बहुत बहुत धन्यवाद - तुम मुझे बचा लिया)। छवि (सिर्फ सीमा के भीतर फिट) फसल के बिना इस करना चाहते हैं, जो किसी को भी के लिए, मैं पाया है कि इस काम करता है:

if (maxWidth > width && maxHeight > height) { 
    return { width, height }; 
} 

aspectRatio = width/height, 
scale  = max(maxWidth/width, maxHeight/height); 

scaledHeight = height * scale, 
scaledWidth = width * scale; 

if (scaledHeight > maxHeight) { 
    scaledHeight = maxHeight; 
    scaledWidth = aspectRatio * scaledHeight; 
} else if (scaledWidth > maxWidth) { 
    scaledWidth = maxWidth; 
    scaledHeight = scaledWidth/aspectRatio; 
} 

return { scaledHeight, scaledWidth }; 
संबंधित मुद्दे