2013-07-12 6 views
0

Я пытаюсь загрузить изображение в приложение, которое я создаю. Изображение .png занимает около 190 КБ в файловой системе, а разрешение - 2000 пикселей в ширину и 1667 пикселей в высоту. Я установил ограничение памяти для PHP для 32 МБ. Но когда я пытаюсь загрузить этот .png изображение, которое я считаю, много людей, используя мое приложение будет делать, я получаю следующее сообщение об ошибкеОшибка загрузки PNG - выделенная ошибка размера памяти

Allowed memory size of 33554432 bytes exhausted (tried to allocate 13336000 bytes) 

Теперь, когда я вычислил их в МБ сказать, я понял, что он прочитал

Allowed memory size of 32MB exhausted (tried to allocate 12.71MB) 

так что я не понимаю, как же файл, который показывает размер 190KB в файловой системе в конечном итоге занимает так много места в памяти? Это что-то о том, как обрабатываются файлы .png в памяти, о которых я не знаю?

Вот код

private function optimise_image($source_path, $destination_path){ 
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_path); 
    //Using this source path, we'll create a memory instance of the image for processing 
    $source_image_ratio = $source_image_width/$source_image_height; 
    switch ($source_image_type) { 
     case IMAGETYPE_GIF: 
      $source_gd_image = imagecreatefromgif($source_path); 
      break; 
     case IMAGETYPE_JPEG: 
      $source_gd_image = imagecreatefromjpeg($source_path); 
      break; 
     case IMAGETYPE_PNG: 
      $source_gd_image = imagecreatefrompng($source_path); 
      break; 
    } 

Ошибка встречающийся в imagecreatefrompng(). Я загружаю изображение здесь, чтобы уменьшить его разрешение и установить его качество для оптимизации хранения и пропускной способности при просмотре.

Изучив еще немного, я обнаружил, что файл загружается, а размер файла на сервере - 190 КБ. Таким образом, фрагмент кода, который вы видите, - это то место, где он пытается снова найти файл для обработки. До этого нет места в процессе, когда файл загружается в память один раз, а затем остается там без разрушения (что, как я думал, было бы тем, что могло бы произойти)

Если вам нужна дополнительная информация, сделайте спросите, я и я попытаемся ответить соответственно.

Заранее спасибо :)

+2

Опубликуйте код, чтобы получить лучшее представление об этом. – Rikesh

+0

установить размер памяти, используя ini_set ('memory_limit', '200M'), как это – Sundar

+0

@Sundar Зачем вам нужно 200M для изображения 190Kb? – tlenss

ответ

2

изображения ширина х изображения высоты х 4 байта (32 бита) на пиксель требуется только для imagecreatefrompng/imagecreatefromjpeg

Так что примерно 12MB в вашем случае

Это оставляет только 20 МБ для GD lib и других PHP-процессов.

+0

Да. Это ответ, который я искал. Очень интересно знать, как все это сводится к байтам и битам. Спасибо, что дали ответ, чтобы понять. Таким образом, я думаю, что 190 КБ - это размер файла, однажды сжатого в файловой системе. Другой ключ, который, как я думал, будет связан с разрешением, заключался в том, что каждый раз, когда я открывал файл, мой поклонник просто завис на короткое время, нечетный для такого маленького файла (и потребовалось больше времени, чтобы открыть этот файл). Еще раз спасибо :) –

Смежные вопросы