2008-08-22 5 views
9

मैं उन प्रारूपों के एक किस्म में अवतार की तरह छवियों को अपलोड करने के लिए (GIF, JPEG, और PNG कम से कम) की अनुमति देने के लिए, लेकिन उन सब पीएनजी डेटाबेस BLOBs के रूप में सहेजना चाहते हैं। यदि छवियों का आकार बढ़ाया गया है, तो पिक्सेल वार, मैं उन्हें डीबी-सम्मिलन से पहले आकार बदलना चाहता हूं।जीडी का उपयोग करके एक अपलोड की गई छवि को पीएनजी में कैसे बदलूं और परिवर्तित करें?

आकार बदलने और पीएनजी रूपांतरण करने के लिए जीडी का उपयोग करने का सबसे अच्छा तरीका क्या है?

संपादित करें: दुख की बात है, केवल GD सर्वर पर उपलब्ध है, जिसका उपयोग करने की आवश्यकता है, ImageMagick

+0

डीबी से या उससे छवियों को स्टोर या स्टोर न करें। – dlamblin

उत्तर

23
<?php            
/* 
Resizes an image and converts it to PNG returning the PNG data as a string 
*/ 
function imageToPng($srcFile, $maxSize = 100) { 
    list($width_orig, $height_orig, $type) = getimagesize($srcFile);   

    // Get the aspect ratio 
    $ratio_orig = $width_orig/$height_orig; 

    $width = $maxSize; 
    $height = $maxSize; 

    // resize to height (orig is portrait) 
    if ($ratio_orig < 1) { 
     $width = $height * $ratio_orig; 
    } 
    // resize to width (orig is landscape) 
    else { 
     $height = $width/$ratio_orig; 
    } 

    // Temporarily increase the memory limit to allow for larger images 
    ini_set('memory_limit', '32M'); 

    switch ($type) 
    { 
     case IMAGETYPE_GIF: 
      $image = imagecreatefromgif($srcFile); 
      break; 
     case IMAGETYPE_JPEG: 
      $image = imagecreatefromjpeg($srcFile); 
      break; 
     case IMAGETYPE_PNG: 
      $image = imagecreatefrompng($srcFile); 
      break; 
     default: 
      throw new Exception('Unrecognized image type ' . $type); 
    } 

    // create a new blank image 
    $newImage = imagecreatetruecolor($width, $height); 

    // Copy the old image to the new image 
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 

    // Output to a temp file 
    $destFile = tempnam(); 
    imagepng($newImage, $destFile); 

    // Free memory       
    imagedestroy($newImage); 

    if (is_file($destFile)) { 
     $f = fopen($destFile, 'rb'); 
     $data = fread($f);  
     fclose($f); 

     // Remove the tempfile 
     unlink($destFile);  
     return $data; 
    } 

    throw new Exception('Image conversion failed.'); 
} 
+0

इस समाधान के लिए धन्यवाद! :) यह आंशिक रूप से पारदर्शी चित्रों के साथ भी काम करता है (वह मेरी मूल समस्या थी)! – bastiandoeen

0

This article ऐसा लगता है कि यह वही होगा जो आप चाहते हैं। आपको imageppeg() फ़ंक्शन को imagepng() में बदलने की आवश्यकता होगी और इसे पृष्ठ पर आउटपुट करने के बजाय फ़ाइल को स्ट्रिंग में सहेजना होगा, लेकिन इसके अलावा यह आपके मौजूदा कोड में आसान प्रतिलिपि/पेस्ट होना चाहिए।

0

क्या जीडी बिल्कुल आवश्यक है? ImageMagick तेज है, बेहतर छवियां उत्पन्न करता है, अधिक विन्यास योग्य है, और आखिरकार (आईएमओ) कोड के लिए बहुत आसान है।

+0

लगता है लेकिन एक साधारण वाणिज्यिक। कोई सबूत? – Green

+0

निश्चित रूप से। एक फसल थंबनेल बनाने के लिए: '$ image = नया इमेजिक ($ image_path); $ छवि-> फसल थंबनेल इमेज (100,100); कोड की दो पंक्तियों में जीडी में ऐसा करने का प्रयास करें। ImageMagick विशेष रूप से छवियों में हेरफेर करने के लिए डिज़ाइन किया गया टूलकिट है, इसलिए यह आम तौर पर PHP के हिस्से में यादृच्छिक फेंकने से बेहतर होता जा रहा है। – ceejayoz

0

मुझे लगता है कि this page एक अच्छा प्रारंभिक बिंदु है। यह imagecreatefrom (jpeg/gif/png) का उपयोग करता है और आकार बदलता है और छवि को परिवर्तित करता है और फिर ब्राउज़र पर आउटपुट करता है। ब्राउज़र को आउटपुट करने के बजाय आप कोड-रीराइट के कई मिनटों के बिना डीबी में बीएलओबी में आउटपुट कर सकते हैं।

3

यदि आप gdlib का उपयोग करना चाहते हैं, तो gdlib 2 या उच्चतर का उपयोग करें। इसमें imagecopyresampled() नामक एक फ़ंक्शन है, जो आकार बदलने के दौरान पिक्सल को अलग करेगा और बेहतर दिखाई देगा।

इसके अलावा, मैं हमेशा शुद्ध कि डेटाबेस में छवियों भंडारण बुरा रूप है चारों ओर ध्यान दिया सुना है:

  • यह डिस्क की तुलना में उपयोग करने के लिए धीमी है
  • आपका सर्वर के लिए एक स्क्रिप्ट चलाने के लिए की आवश्यकता होगी छवि के लिए बस एक फ़ाइल की सेवा के बजाय मिल
  • आपकी स्क्रिप्ट अब सामान का एक बहुत वेब इस्तेमाल किया सर्वर के लिए जिम्मेदार है:
    • Se उचित सामग्री-प्रकार शीर्षलेख
    • उचित कैशिंग/टाइमआउट/ई-टैग हेडर सेट करना, ताकि ग्राहक छवि को सही तरीके से कैश कर सकें। यदि यह सही तरीके से नहीं करता है, तो छवि सेवा स्क्रिप्ट प्रत्येक अनुरोध पर हिट होगी, सर्वर पर लोड को और भी बढ़ाना होगा।

केवल लाभ मैं देख सकता है कि आप अपने डेटाबेस और छवि फ़ाइलों को सिंक्रनाइज़ रखने की जरूरत नहीं है। हालांकि मैं इसके खिलाफ अभी भी सिफारिश करूंगा।

+0

यह निश्चित रूप से एक स्थिर डोमेन या सीडीएन पर अपने स्वयं के प्रकाश-व्याप्त स्थिर सर्वर पर ऑफ़लोड करने की तुलना में डीबी से छवियों की सेवा करने के लिए बेकार है। – dlamblin

6

आपका प्रक्रिया चरणों इस तरह दिखना चाहिए:

  1. Verifyfiletype
  2. लोड छवि अगर यह जीडी में एक समर्थित फ़ाइल प्रकार imagecreatefrom*
  3. imagecopyresize या imagecopyresampled
  4. सहेजें का उपयोग आकार बदला जा रहा है का उपयोग करते हुए imagepng($handle, 'filename.png', $quality, $filters)
का उपयोग कर छवि

ImageMagick तेज़ है, बेहतर छवियां उत्पन्न करता है, अधिक कॉन्फ़िगर करने योग्य है, और आखिरकार (आईएमओ) कोड के लिए बहुत आसान है।

@ceejayoz बस नई जी.डी. के लिए प्रतीक्षा - यह MySQLi तरह OOP है और यह वास्तव में बुरा नहीं है :)

3

क्या आप वाकई सर्वर पर कोई ImageMagick है कर रहे हैं?

मैं अतिथि आप PHP का उपयोग करते हैं (प्रश्न PHP के साथ टैग किया गया है)। होस्टिंग कंपनी जिसका मैं उपयोग करता हूं, कोई छवि मैगिक एक्सटेंशन phpinfo() के अनुसार चालू नहीं है।

लेकिन जब मैंने उनसे पूछा कि PHP कोड से उपलब्ध ImageMagick प्रोग्राम की सूची है। तो बस - PHP में कोई आईएम इंटरफ़ेस नहीं है, लेकिन मैं सीधे आईएम प्रोग्राम को PHP से कॉल कर सकता हूं।

मुझे आशा है कि आपके पास एक ही विकल्प होगा।

और मैं दृढ़ता से सहमत - डेटाबेस में छवियों भंडारण अच्छा विचार नहीं है।

3

कुछ इस तरह, शायद:


<?php 
    //Input file 
    $file = "myImage.png"; 
    $img = ImageCreateFromPNG($file); 

    //Dimensions 
    $width = imagesx($img); 
    $height = imagesy($img); 
    $max_width = 300; 
    $max_height = 300; 
    $percentage = 1; 

    //Image scaling calculations 
    if ($width > $max_width) { 
     $percentage = ($height/($width/$max_width)) > $max_height ? 
      $height/$max_height : 
      $width/$max_width; 
    } 
    elseif ($height > $max_height) { 
     $percentage = ($width/($height/$max_height)) > $max_width ? 
      $width/$max_width : 
      $height/$max_height; 
    } 
    $new_width = $width/$percentage; 
    $new_height = $height/$percentage; 

    //scaled image 
    $out = imagecreatetruecolor($new_width, $new_height); 
    imagecopyresampled($out, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

    //output image 
    imagepng($out); 
?> 

इसलिए कुछ वाक्यविन्यास त्रुटियों हो सकता है मैं कोड का परीक्षण नहीं किया, लेकिन यह आप यह कैसे किया जा सकता है पर एक निष्पक्ष प्रस्तुति देना चाहिए। इसके अलावा, मैंने एक पीएनजी फ़ाइल ग्रहण की। फ़ाइल प्रकार निर्धारित करने के लिए आप किसी प्रकार का स्विच स्टेटमेंट लेना चाहेंगे।

0

phpThumb एक उच्च स्तरीय अमूर्त कि को देख लायक हो सकता है।

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

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