2013-04-27 9 views
5

मैं PHP के साथ एक छवि घूर्णन और क्रॉप कर रहा हूं, लेकिन मुझे काला सीमा दिखाई दे रही है, मुझे पता है कि आप पृष्ठभूमि रंग बदल सकते हैं, लेकिन मैं पूरी छवि को भरने के लिए छवि को घूमना और फसल करना चाहता हूं। मूल रूप से कुछ (दाएं) बनाम सीएसएस में background-size: cover; (बाएं) के समान कुछ।घुमाएं और फसल

नीचे दी गई छवि देखें, ठीक वही है जो मुझे मिला है, बाएं मैं प्राप्त करना चाहता हूं। घुमाने के लिए डिग्री की संख्या गतिशील है और छवि का उत्पादन किया जाना चाहिए और स्रोत-छवि दोनों वर्ग (200x200) हैं।

Illustration of problem

संपादित करें: यहाँ मेरी त्वरित और गंदी कोड है:

$degrees = rand(1,360); 
$square_image = imagerotate($square_image, $degrees, 0); 
imagejpeg($square_image,NULL,100); 
इस के साथ

:

$rotate = imagecreatefromjpeg($image); 
// part of code created by www.thewebhelp.com, modified 
$square_size = 200; 
$original_width = imagesx($rotate); 
$original_height = imagesy($rotate); 
if($original_width > $original_height){ 
    $new_height = $square_size; 
    $new_width = $new_height*($original_width/$original_height); 
} 
if($original_height > $original_width){ 
    $new_width = $square_size; 
    $new_height = $new_width*($original_height/$original_width); 
} 
if($original_height == $original_width){ 
    $new_width = $square_size; 
    $new_height = $square_size; 
} 

$new_width = round($new_width); 
$new_height = round($new_height); 

$smaller_image = imagecreatetruecolor($new_width, $new_height); 
$square_image = imagecreatetruecolor($square_size, $square_size); 

imagecopyresampled($smaller_image, $rotate, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height); 

if($new_width>$new_height){ 
    $difference = $new_width-$new_height; 
    $half_difference = round($difference/2); 
    imagecopyresampled($square_image, $smaller_image, 0-$half_difference+1, 0, 0, 0, $square_size+$difference, $square_size, $new_width, $new_height); 
} 
if($new_height>$new_width){ 
    $difference = $new_height-$new_width; 
    $half_difference = round($difference/2); 
    imagecopyresampled($square_image, $smaller_image, 0, 0-$half_difference+1, 0, 0, $square_size, $square_size+$difference, $new_width, $new_height); 
} 
if($new_height == $new_width){ 
    imagecopyresampled($square_image, $smaller_image, 0, 0, 0, 0, $square_size, $square_size, $new_width, $new_height); 
} 

$degrees = rand(1,360); 
$square_image = imagerotate($square_image, $degrees, 0); 
imagejpeg($square_image,NULL,100); 
+0

अपना कोड दिखाएं। – sachleen

+0

मुझे लगता है कि आपकी 'पृष्ठभूमि-आकार' समानता आपके लिए आवश्यकतानुसार नहीं मिलती है। – Ejaz

+0

http://stackoverflow.com/a/22511805/2106820 –

उत्तर

5

अपने कोड के अंत के आसपास में इन पंक्तियों की जगह

$degrees = rand(1,360); 
$square_image = imagerotate($square_image, $degrees, 0); 

$rotated_size = imagesx($square_image); 
$enlargement_coeff = ($rotated_size - $square_size) * 1.807; 
$enlarged_size = round($rotated_size + $enlargement_coeff); 
$enlarged_image = imagecreatetruecolor($enlarged_size, $enlarged_size); 
$final_image = imagecreatetruecolor($square_size, $square_size); 

imagecopyresampled($enlarged_image, $square_image, 0, 0, 0, 0, $enlarged_size, $enlarged_size, $rotated_size, $rotated_size); 
imagecopyresampled($final_image, $enlarged_image, 0, 0, round($enlarged_size/2) - ($square_size/2), round($enlarged_size/2) - ($square_size/2), $square_size, $square_size, $square_size, $square_size); 

imagejpeg($final_image,NULL,100); 

यहाँ कि पीछे तर्क दिया गया है:

1) imagerotate प्रदर्शन करने के बाद() हमारी नई छवि, इसके आयाम बदल गया है के बाद से हर रोटेशन आम तौर पर एक बड़ी छवि का परिणाम है। चूंकि स्रोत एक स्क्वायर छवि है, इसलिए घुमावदार छवि के आयामों को निर्धारित करने के लिए हम या तो चौड़ाई या ऊंचाई लेते हैं।

2) जब मूल छवि घुमाया जाता है, यहां तक ​​कि थोड़ा सा, मूल छवि से उपयोग करने योग्य पिक्सेल डेटा के सबसे बड़े वर्ग के आयाम हमेशा मूल अज्ञात वर्ग छवि से छोटे होंगे। इसलिए, आरंभिक वर्ग छवि के समान आकार की एक नई स्क्वायर छवि उत्पन्न करने के लिए, लेकिन "ब्लैक बॉर्डर" आर्टिफैक्ट के बिना, जैसा कि आप इसे कॉल करते हैं, हमें घुमावदार छवि को बड़ा करने की आवश्यकता है, ताकि उपयोग करने योग्य पिक्सेल का सबसे बड़ा वर्ग घुमावदार छवि में मूल छवि से डेटा प्रारंभिक वर्ग छवि के रूप में बड़ा हो सकता है।

यहां महत्वपूर्ण मूल्य 1.807 है। यह मान मूल रूप से दिखाता है कि आपके आयामों और मूल अप्रत्याशित छवि के आयामों के बीच अंतर के प्रत्येक पिक्सेल के लिए घुमावदार छवि को बढ़ाने के लिए आपको कितने पिक्सेल की आवश्यकता है। इस मूल्य को पुनः प्राप्त करने के लिए शायद एक बेहतर गणित सूत्र है, दुर्भाग्य से मैं गणित में चूसता हूं, इसलिए यहां उस मूल्य के साथ आने का कठिन तरीका है।

  • 45/135/225/315 डिग्री का घूर्णन हमेशा सबसे कम उपयोग करने योग्य पिक्सेल डेटा वर्ग के साथ सबसे बड़ी छवि का उत्पादन करेगा।
  • यह जानकर, आप मूल छवि के आयामों और इसकी 45-डिग्री-घूर्णन संस्करण की तुलना करते हैं। हमारे मामले में मूल छवि 200x200 है और 45-डिग्री-घुमावदार संस्करण लगभग 283x283
  • फ़ोटोशॉप जैसे प्रोग्राम में, आप निर्धारित करते हैं कि छवि के 45-डिग्री-घुमावदार संस्करण को बढ़ाने के लिए आपको कितनी बार आवश्यकता है "ब्लैक बॉर्डर" के बिना 200x200 वर्ग निकालने में सक्षम हो जाएं - हमारे मामले में 283x283 छवि को 433x433 छवि में विस्तारित करने की आवश्यकता है, इसलिए हम 200x200 वर्ग
  • 433 - 283 = 150 -> अर्थ निकाल सकते हैं हमें 200x200 वर्ग निकालने में सक्षम होने के लिए 150 पिक्सेल के साथ सबसे बड़ी संभव घुमावदार छवि को विस्तारित करने की आवश्यकता है।
  • 283 - 200 = 83 -> 83 पिक्सेल सबसे बड़ी संभव घुमावदार छवि और मूल अनारक्षित छवि के बीच अंतर है।
  • परिवर्तन "छोटा" - वर्ग क्षेत्र का "बड़ा" हम उपयोग कर सकते हैं और इस प्रकार - "छोटे" विस्तार की मात्रा जिसे हमें लागू करने की आवश्यकता है। और चूंकि 45 डिग्री रोटेशन के परिणामस्वरूप मूल छवि और रूपांतरित छवि के बीच 83 पिक्सेल के अंतर में 150 पिक्सेल वृद्धि की आवश्यकता होती है, हम कर सकते हैं:
  • 150/83 = 1.807 -> जिसका अर्थ है 1 पिक्सेल के बीच मूल छवि और घुमाया छवि कि घुमाया छवि, 1.807 पिक्सल के साथ बढ़े हुए है ताकि हम है कि मूल छवि

3) यह जानते हुए कि प्रत्येक 1 पिक्सेल अंतर के लिए के रूप में एक ही आयाम इसमें से एक वर्ग निकाल सकते हैं की आवश्यकता है हमें 1.807 पिक्सल के साथ विस्तार करने की आवश्यकता है, हम जांचते हैं कि हमारे घुमावदार छवि आकार और मूल छवि आकार के बीच क्या अंतर है और यह उस मूल्य से गुणा करें, यह देखने के लिए कि बढ़ी हुई छवि में आयामों का क्या होना चाहिए:

$enlargement_coeff = ($rotated_size - $square_size) * 1.807; 
$enlarged_size = round($rotated_size + $enlargement_coeff); 

4) हम आगे बढ़ते हैं और बढ़ी हुई घुमावदार छवि उत्पन्न करते हैं।

imagecopyresampled($enlarged_image, $square_image, 0, 0, 0, 0, $enlarged_size, $enlarged_size, $rotated_size, $rotated_size); 

5) अंत में, हम हमारे बढ़े हुए घुमाया छवि से निकालने के एक 200x200 का वर्ग, इसके केंद्र का उपयोग कर संदर्भ के रूप में निर्देशांक

imagecopyresampled($final_image, $enlarged_image, 0, 0, round($enlarged_size/2) - ($square_size/2), round($enlarged_size/2) - ($square_size/2), $square_size, $square_size, $square_size, $square_size); 

($square_size/2) नीचे कि तोड़ने एक्स रिटर्न और वाई केंद्र बिंदु के निर्देशांक के लिए बढ़ी हुई घुमावदार छवि में। 20012200 वर्ग प्राप्त करने के लिए round($enlarged_size/2) एक्स अक्ष के साथ केंद्र से बाईं ओर पिक्सेल की मात्रा और वाई अक्ष के साथ केंद्र के ऊपर लौटाता है।


मुझे आशा है कि आप तर्क को समझते हैं, हालांकि मैं अपने स्पष्टीकरण को समझने कर रहा हूँ थोड़ा अस्पष्ट लग सकता है, इसलिए अधिक पूछने के लिए संकोच न करें!

+0

वाह! उस विस्तृत स्पष्टीकरण के लिए धन्यवाद। आपका समाधान काम करता है, लेकिन आकार बदलने के कारण बहुत सारी गुणवत्ता हानि है, क्या आप इसे ठीक कर सकते हैं? – aNewStart847

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