2009-08-13 6 views
6

मेरे पास हमेशा मेरे ग्राहकों के लिए वेबसाइटों में एक PHP आकार बदलें (जीडी का उपयोग करके) है। इससे कोई फर्क नहीं पड़ता कि मैं उन्हें अपलोड करने से पहले अपने डिजिटल कैमरे से अपनी विशाल 7 एमपी छवियों का आकार बदलने के लिए कितनी बार कहता हूं, फिर भी वे इसे कभी नहीं करते हैं। नतीजा सर्वर से "स्मृति से बाहर" त्रुटि है, और छवि का आकार बदल नहीं आता है, क्योंकि मूल छवि बहुत बड़ी संकल्प-वार थी।मेरे सर्वर पर जीडी लाइब्रेरी के लिए छवियों का आकार बहुत बड़ा

क्या वास्तव में बड़ी छवियों का आकार बदलने का एक बेहतर तरीका है? क्या ऐसी कोई सेवा है जो एक एपीआई प्रदान करती है जिसे मैं इन बड़ी छवियों का आकार बदलने के लिए अपनी स्क्रिप्ट के माध्यम से टैप कर सकता हूं?

+0

ImageMagick लोड पर कुशल आकार बदलने की अनुमति देता है, इस उत्तर में और विवरण देखें: http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing-in-php/4613341#4613341 –

उत्तर

3

आप अपने php पृष्ठ से चित्र का आकार बदलने के ImageMagick कॉल कर सकते हैं, लेकिन एक सुरक्षा तो बात हो, तो आप सिस्टम को कॉल

किसी भी एपीआई मेमोरी का एक बहुत का उपयोग करेगा, आप अपने php memory_limit रूप में अच्छी तरह से बदल सकते हैं अनुमति देते हैं।

1

आप बाहरी प्रोग्राम में बाहर निकल सकते हैं, उदाहरण के लिए convert का उपयोग कर।

1

उन्हें कैसे तो अपलोड करने आकार काम कतार के बारे में, एक कमांड लाइन PHP स्क्रिप्ट तो लेने और प्रक्रिया कर सकते हैं (तेजी से और एक अलग स्मृति सीमा और निष्पादन समय हो सकता है)

3

आप में उपलब्ध ImageMagick एपीआई है, तो आपके PHP विन्यास - इसका इस्तेमाल करें! ImageMagick PHP memory_limit में गिना नहीं जाता है और इसलिए बड़ी फ़ाइलों के साथ काम कर सकता है।

तुम सच में सर्वर पर कोई नियंत्रण नहीं है, तो जल्दी और बहुत बुरा समाधान नहीं है - $ _POST से छवि फ़ाइल प्राप्त करने के बाद, पहले से आयाम की जाँच करें:

<?php 
$image_size = getimagesize("yourfile.jpg") 
$mem_usage = $image_size[0] * $image_size[1] * 4 //4 bytes per pixel (RGBA) 
if ($mem_usage > $mem_aviable) { 
    die ('Please upload smaller pic. I tell you that all the time. '. 
     'Resize yout huge 7MP images from your digital camera '. 
     'before uploading them.'); //Better put something more polite here. 
} 
+0

"चेतावनी संदेश" ":) –

1

बस इसे छोटे उनका आकार बदल दें बनाना इसे अपलोड करने से पहले। MAX_FILE_SIZE

+0

यह कसरत नहीं करेगा। छवियों में कई पिक्सल हो सकते हैं (जैसे 2000x5700) हालांकि वे बहुत छोटे हैं (जैसे 304 केबी)। – Christian

0

मैं कुछ समय बिताया था डिबग PHP कोड है कि जी.डी. सीधे इस्तेमाल करने की कोशिश कर, लेकिन बड़े चित्र पर और छवियों कि मामूली त्रुटियों कि जी.डी. चोक हो चुके है करने के लिए लग रहा था के एक उपसमूह पर असफल रहा।

लेकिन फिर मुझे phpThumb (http://phpthumb.sourceforge.net/) मिला, और मैं कभी वापस नहीं जा रहा हूं। मेरी वेब निर्देशिका (phpthumb.class.php और phpthumb.functions.php) के लिए दो PHP फ़ाइलों को जोड़ने के बाद मैं अपने थंबनेल उत्पन्न करने के लिए निम्नलिखित कोड का उपयोग करने में सक्षम था:

include("phpthumb.class.php"); 

// Load data into phpThumb object and set parameters 
$phpThumb = new phpThumb(); 
$phpThumb->setSourceData(file_get_contents($_GET['filename'])); 
$phpThumb->setParameter('w', $width); // Set width 
$phpThumb->setParameter('h', $height); // Set height 
$phpThumb->setParameter('zc', 1);  // Specify zoom-crop (instead of stretch) 
$phpThumb->setParameter('q', 100);  // Specify quality 

// Generate & output thumbnail 
$phpThumb->GenerateThumbnail();  // Generate the thumbnail 
$phpThumb->OutputThumbnail();   // Output it to browser 
$phpThumb->RenderToFile("$thumbname"); // Output it to file 
$phpThumb->purgeTempFiles();   // Clean up 

बूम, एक आकर्षण की तरह काम करता है, बहुत तेजी से है और बड़े के साथ कोई समस्या नहीं है फ़ाइलें। इसके अलावा, यह सर्वर पर उपलब्ध होने के आधार पर जीडी या इमेजमैजिक का उपयोग कर सकता है, इसलिए यह अपेक्षाकृत पोर्टेबल है।

+0

पीएस। वहाँ phpThumb.php भी है, जिसे आप लिंक कर सकते हैं, और जो क्वेरी स्ट्रिंग (और एक कॉन्फ़िगरेशन फ़ाइल) की जानकारी के आधार पर सीधे थंबनेल बनाएगा, लेकिन यह मेरी आवश्यकताओं के अनुरूप नहीं था। – Magnus

2

मैं इस समस्या के साथ दिनों (और रातें) के लिए अटक गया।

इसके अलावा, प्रदाता स्मृति सीमा एक से दूसरे में भिन्न होती है। और PHP में memory_limit को साझा सर्वर पर काम नहीं करता है, प्रदाता आम तौर पर राम को सीमित करते हैं, भले ही phpinfo() कहता है कि आपको 128 एमओ (उदाहरण के लिए प्रति प्रक्रिया 1 एम 1 रैम 60 एमओ तक सीमित है)।

लेकिन मैं अंत में कुछ काफी यहाँ कुशल पाया: http://www.imagemagick.org/Usage/files/#massive

यह जरूरत imagemagick, लेकिन मुझे पता चला कि प्रदाताओं के सबसे मूल रूप से अपने सर्वर, यहां तक ​​कि साझा वालों पर इस प्रदान करता है।

exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg'); 

के रूप में यह कहा है:

  • env MAGICK_TMPDIR=<tmp_dir> राम (एक तरह से)

  • nice -5 भी की प्राथमिकता बदलने के लिए एक यूनिक्स कमांड है अनुकरण करने के लिए ImageMagick के लिए एक अस्थायी निर्देशिका की स्थापना एक प्रक्रिया (http://en.wikipedia.org/wiki/Nice_(Unix))

  • convert ... ImageMagick कमांड लाइन

असली सौदा के बारे में -limit memory 32 और -limit map 32 है। इस तरह आप बाइनरी द्वारा उपयोग की गई स्मृति को सीमित करते हैं (यहां: 32 एमओ)। आपको शायद अपने सर्वर के मानों से मेल खाने के लिए मूल्यों को फिट करने की आवश्यकता होगी (आम तौर पर PHP आपको अधिकतम आवंटित स्मृति बताता है जब यह आपको घातक त्रुटि देता है। मेरा सुझाव है कि आप इस मान को 2 या 4 को confortable के लिए विभाजित करें)।

मैं अपने PHP में कुछ अन्य लाइनों डाल करने के लिए कुछ जमानत मुद्दों से बचने की जरूरत:

ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts 
set_time_limit(0); // ignore server timeout 
putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case 

आशा सब में मदद मिलेगी ... अगर convert पर उपलब्ध है


पता करने के लिए आपके सर्वर, आप (PHP में) यह कोशिश कर सकते हैं:

$out = array(); 
exec('which convert 2>&1', $out); 
print_r($out); 

कि आप पैट देता है यदि बाइनरी है, तो मौजूद है।