Проблема в создании эскиза PNG изображения! - PullRequest
0 голосов
/ 12 июля 2010

Я использовал следующую функцию php для создания эскиза изображения.

function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth ) 
{
  $dir = opendir( $pathToImages );

  while (false !== ($fname = readdir( $dir ))) {  
    $info = pathinfo($pathToImages . $fname);
    if ( strtolower($info['extension']) == 'jpg' ||  strtolower($info['extension']) == 'png' ) 
    {
      // load image and get image size
      if(strtolower($info['extension']) == 'jpg')
      $img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );
      else
      $img = imagecreatefrompng( "{$pathToImages}{$fname}" );
      $width = imagesx( $img );
      $height = imagesy( $img );

      // calculate thumbnail size
      $new_width = $thumbWidth;
      $new_height = floor( $height * ( $thumbWidth / $width ) );

      // create a new tempopary image
      $tmp_img = imagecreatetruecolor( $new_width, $new_height );

      // copy and resize old image into new image 
      //imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
      imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

      // save thumbnail into a file
      if(strtolower($info['extension']) == 'jpg')
      imagejpeg( $tmp_img, "{$pathToThumbs}{$fname}" );
      else
      imagepng( $tmp_img, "{$pathToThumbs}{$fname}" );
    }
  }
  // close the directory
  closedir( $dir );
}

Для изображения jpg создан правильный эскиз. Но для png прозрачного изображения миниатюра создается с черным фоном. Как мне заставить функцию работать для png изображения? Пожалуйста, предложите мне. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 марта 2011

Вы пытаетесь изобрести велосипед? Используйте php Thumbnailer :)

<?php
// load the library
require 'Thumbnailer';

// make callback function
function myfunc(& $thumb) {
   // that will make a image thumbnail square 100x100px
   $thumb->thumbSquare(100)->save('photos/output/'.$thumb->filename);
}

// call batch helper
// find all jpg, png and gif images in /photos/directory
Thumbnailer::batch('myfunc', '/photos/directory/*.{jpg,png,gif}');
?>

Это просто.

0 голосов
/ 12 июля 2010

Я не помню точных подробностей, но вы захотите почитать и поэкспериментировать с imagesavealpha () и imageaplphablending ()

Если память мне не изменяет, вам нужно отключить возможность очистки изображений, а затем установить для imageavealpha значение true. (На самом деле, да, страница руководства для imagesavealpha () подразумевает именно это)

Итак, в конце вашего кода:

// save thumbnail into a file
if(strtolower($info['extension']) == 'jpg'){
    imagejpeg( $tmp_img, "{$pathToThumbs}{$fname}");
}else{
    imagealphablending($tmp_img,false);
    imagesavealpha($tmp_img,true);
    imagepng( $tmp_img, "{$pathToThumbs}{$fname}" );
}
...