PHP: преобразование PNG и GIF в оттенках серого - PullRequest
2 голосов
/ 26 января 2010

Я использую следующий скрипт для преобразования jpgs в изображения в градациях серого. http://bubble.ro/How_to_convert_an_image_to_grayscale_using_PHP.html

Я хочу обновить его, чтобы также преобразовывать png (с прозрачностью) и gif (с прозрачностью) в изображения в градациях серого.

На данный момент это не работает. Я запрашиваю image-src для его расширения файла. Если jpg, if, gif или png, я вызываю соответствующее изображение createfrom-jpg-gif-png

Однако я всегда запускаю один и тот же цикл for, и, к сожалению, гифки получают только серые прямоугольники, каждый пиксель серый. Png почти работает, однако прозрачность в pngs преобразуется в черный.

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 26 января 2010

Используйте это найдено здесь http://hm2k.googlecode.com/svn/trunk/code/php/functions/imagegray.php

<?php

function imagegray($img) {
  if (!file_exists($img)) { user_error("'$img' file was not found."); return; }
  list($width, $height, $type) = getimagesize($img);
  switch ($type) {
    case 1:
    $img = imagecreatefromgif($img);
    break;
    case 2:
    $img = imagecreatefromjpeg($img);
    break;
    case 3:
    default:
    $img = imagecreatefrompng($img);
    break;
  }
  imagefilter($img, IMG_FILTER_GRAYSCALE);
  header('Content-type: image/png');
  imagepng($img);
  imagedestroy($img);
}

/*because i'm british*/
function imagegrey($img) {
  return imagegray($img);
}

/*

//example usage

$i=isset($_REQUEST['i'])?$_REQUEST['i']:'';
if ($i) { imagegrey($i); }

*/
1 голос
/ 05 января 2011

Чтобы получить правильные снимки без черного фона, вы должны следовать стратегии:

сначала создайте новый элемент изображения установить его в алфавитном порядке в ложь установить истинное значение savealpha заполнить его с прозрачным прямоугольником скопируйте на него свою затененную картинку

Ваш код будет похож на этот:

        switch ($handle->file_src_name_ext) {
          case 'gif':
            $sourceIm = imagecreatefromgif($savepath.$handle->file_dst_name);
            break;
          case 'jpg':
            $sourceIm = imagecreatefromjpeg($savepath.$handle->file_dst_name);
            break;
          case 'png':
          default:
            $sourceIm = imagecreatefrompng($savepath.$handle->file_dst_name);
            break;
        }


        $iw = imagesx($sourceIm);
        $ih = imagesy($sourceIm);

        $im = imagecreatetruecolor($iw, $ih);

        if (function_exists('imagecolorallocatealpha')) {
            imagealphablending($im, false);
            imagesavealpha($im, true);
            $transparent = imagecolorallocatealpha($im, 255, 255, 255, 127);
            imagefilledrectangle($im, 0, 0, $iw, $ih, $transparent);
        }
        if ($sourceIm ) {
          imagefilter($sourceIm, IMG_FILTER_GRAYSCALE);
        }
        imagecopyresampled($im, $sourceIm, 0, 0, 0, 0, $iw, $ih, $iw, $ih);
        switch ($handle->file_src_name_ext) {
          case 'gif':
            imagepng($im, $savepath.'grd'.$row->id.'.gif');
            break;
          case 'jpg':
            imagejpeg($im, $savepath.'grd'.$row->id.'.jpg');
            break;
          case 'png':
          default:
            imagepng($im, $savepath.'grd'.$row->id.'.png');
            break;
        }

Гудлак!


взгляни на мой балда помошник

1 голос
/ 26 января 2010
$image = ImageCreateFromString(file_get_contents('/path/to/image.ext'));

ImageFilter($image, IMG_FILTER_GRAYSCALE);

ImageGIF($image); // or ImagePNG($image);
0 голосов
/ 27 января 2010

спасибо!

imagefilter ($ img, IMG_FILTER_GRAYSCALE);

это почти работает. У меня все еще есть проблемы с прозрачностью. PNG с прозрачным фоном преобразуются в черный (фон черный). То же самое происходит с гифками, и более того гифки с прозрачностью не получают должным образом оттенки серого. Есть несколько очень серых оттенков, но есть бледно-гринтоны и красные тона.

<?php                                                                       
$src = $_GET['src'];

$img_ext;
if (preg_match('/\.(\w{3,4})$/i', $src, $reg)) {
    $img_ext = strtolower($reg[1]);
}

$source_file = $src;
if ($img_ext == "jpg" || $img_ext == "jpeg") { //jpg
    $im = imagecreatefromjpeg($source_file);
} else if ($img_ext == "gif") {
    $im = imagecreatefromgif($source_file); //gif
} else if ($img_ext == "png") {
    $im = imagecreatefrompng($source_file); //png
} else {
}

ImageFilter($im, IMG_FILTER_GRAYSCALE);


if ($img_ext == "jpg" || $img_ext == "jpeg") { //jpg
    header('Content-type: image/jpeg');
    imagejpeg($im);
} else if ($img_ext == "gif") { //gif
    header('Content-type: image/gif');
    imagegif($im);
} else if ($img_ext == "png") { //png
    header('Content-type: image/png');
    imagepng($im);
} else {
}

?>
...