2016-01-08 5 views
15

का उपयोग करके इसे आकार देने के दौरान छवि का आकार बर्बाद हो गया है मेरी वेबसाइट पर छवियों को अपलोड करने के बाद, छवियों का आकार बदल रहा है। मैं imagecreatefromjpeg और imagecopyresampled फ़ंक्शंस का उपयोग कर रहा हूं। मैंने देखा है कि रंग मूल छवि के समान नहीं है।imagecopyresampled

यहां आप अंतर देख सकते हैं। आप फ्लिकर से छवि को सही रंगों और मेरी वेबसाइट से छवि के पीछे देख सकते हैं। Example

मूल छवि:https://c2.staticflickr.com/6/5754/23693488109_74c67f012a_k.jpg

rsizing के बाद:https://www.isrart.co.il/img/uploads/art/viewer/big/photo-2b971e861c7aa2c57b8f7667ec666c3d.jpg

यहाँ मेरी PHP कोड है:

$type = @getImageSize($_FILES['photo']['tmp_name'])[2]; 
    switch ($type) { 
     case 1 : 
      $img = imageCreateFromGif($_FILES['photo']['tmp_name']); 
     break; 
     case 2 : 
      $img = imageCreateFromJpeg($_FILES['photo']['tmp_name']); 
     break; 
     case 3 : 
      $img = imageCreateFromPng($_FILES['photo']['tmp_name']); 
     break; 
     case 6 : 
      $img = imageCreateFromBmp($_FILES['photo']['tmp_name']); 
     break; 
    }  

    $orig_width = imagesx($img); 
    if($orig_width < $width) 
     return $img; 

    $orig_height = imagesy($img); 

    $height = (($orig_height * $width)/$orig_width); 

    $new_image = imagecreatetruecolor($width, $height); 

    imagecopyresampled($new_image, $img, 0, 0, 0, 0, $width, $height, $orig_width, $orig_height); 

    imagejpeg($new_image, $_SERVER['DOCUMENT_ROOT'] . "/img/uploads/" . $path, 100); 
+0

di आप टिप्पणी के माध्यम से जाना है, यह मदद मिल सकती है http://php.net/manual/en/function.imagecreatefromjpeg.php – zod

+1

वास्तविक मूल और resampled छवियों पोस्ट करें - बल्कि उनमें से एक तस्वीर की तुलना में। –

+0

@MarkSetchell ठीक :) –

उत्तर

9

आपकी मूल छवि में 560-बाइट आईसीसी प्रोफ़ाइल है, जबकि आपकी पुन: चित्रित छवि नहीं है।

आप इस तरह ImageMagick का उपयोग कर मूल छवि से प्रोफ़ाइल निकाल सकते हैं:

convert orig.jpg profile.icm 

आप इसे यहाँ देख सकते हैं अगर मैं अंतर दो फ़ाइलों:

enter image description here

मुझे लगता है कि ध्यान दें, अगर मैं ImageMagick के साथ कमांड लाइन पर अपनी मूल छवि को दोहराता हूं, तो इस तरह:

convert orig.jpg -resize 1110x1570! myresampled.jpg 

तो आईसीसी प्रोफाइल आगे बढ़ाया जाता है। मैं इस तरह की जांच कर सकता हूं:

identify -verbose orig.jpg myresampled.jpg | grep -i profile 

    Profiles: 
    Profile-icc: 560 bytes 
    Profiles: 
    Profile-icc: 560 bytes 
+0

धन्यवाद, लेकिन मैं PHP में इसका उपयोग कैसे कर सकता हूं? –

+1

यह बहुत आसान है, यहां उदाहरण ... http://php.net/manual/en/imagick.resizeimage.php –

0

मुझे यकीन है कि यह एक PNG फ़ाइल है कर रहा हूँ और वहाँ इसमें एक सूचना खंड है जिसे "गामा" कहा जाता है। यह एक गामा सुधार की तरह है, कुछ दर्शक इसका इस्तेमाल करते हैं, कुछ नहीं करते हैं। जब आप अपनी छवि लोड करते हैं, तो जीडी लाइब्रेरी इस जानकारी को अनदेखा करती है। लेकिन Imagick चाल करना चाहिए:

http://php.net/manual/en/imagick.getimageproperties.php

आशा इस मदद करता है।

+0

मूल छवि एक जेपीजी है: एस –

+0

ओच। और आउटगोइंग एक और जेपीजी है। मुझे तब पता नहीं है ... – dkellner

0

कारण संकुचित छवि मूल की तुलना में सुस्त दिखती है क्योंकि इसका रंग प्रारूप है। मूल 4: 4: 4 क्रोमो उप-नमूनाकरण का उपयोग करता है जबकि संकुचित एक 4: 2: 0 उप-नमूनाकरण का उपयोग करता है। इससे रंग की जानकारी में कमी आती है।

Used mediainfo tool to read image metadata

इस पर काबू पाने के लिए, हम ffmpeg या avconv का उपयोग कर इस स्केलिंग कर सकते हैं और है कि PHP में खोल से क्रियान्वित किया जा सकता।

मैंने निम्नलिखित 2 कमांड के साथ avconv का उपयोग करके अच्छी गुणवत्ता वाली स्केल की गई छवि का उत्पादन किया।

avconv -i Input.jpg -pix_fmt yuvj444p -vf scale=1110:1570 Output.yuv 

avconv -y -s 1110x1570 -f rawvideo -pix_fmt yuv444p -i Output.yuv Output.jpg 
संबंधित मुद्दे