Mam funkcję php o nazwie compressImage(), która wygląda tak:

function compressImage($source, $destination, $quality) {

    $info = getimagesize($source);


    if ($info['mime'] == 'image/jpeg') 
      $image = imagecreatefromjpeg($source);

    elseif ($info['mime'] == 'image/gif') 
      $image = imagecreatefromgif($source);

    elseif ($info['mime'] == 'image/png') 
      $image = imagecreatefrompng($source);

    imagejpeg($image, $destination, $quality);

  }

Próbuję skompresować przesłane obrazy za pomocą tej funkcji. W pliku php o nazwie add1.php nazywam tę funkcję w ten sposób:

if (!empty($_FILES['image1']['name'])) {

    $temp = explode(".", $_FILES["image1"]["name"]);
    $newName = date('Ymdhis')."1";
    $newName = strval($newName) . "." . end($temp);
    $newPath = '../uploads/'.$newName;

    move_uploaded_file($_FILES['image1']['tmp_name'], $target_dir . $newName);
    compressImage($newPath, $newPath, 60);
    $image1 = $newName;

}

Działa to, gdy przesyłam jpeg obrazy i faktycznie zmniejsza ich rozmiar. Ale kiedy przesyłam png pliki, są one przesyłane, ale są zepsute i nie można ich otworzyć. Nie mam pojęcia, jaka jest przyczyna tego problemu. Każda pomoc będzie mile widziana. Dziękuję Ci

php
0
Abdulaziz Yesuf 8 marzec 2020, 12:00

2 odpowiedzi

Najlepsza odpowiedź

Możesz zmodyfikować compressImage tak, aby generował obrazy w tym samym formacie, w jakim zostały dostarczone, i użyć wartości zwracanej z funkcji do dalszego przetwarzania, jeśli jest to wymagane.

function compressImage( $source=false, $destination=false, $quality=80, $filters=false ) {
    $info = getimagesize( $source );
    switch( $info['mime'] ){
        case 'image/jpeg':
            /* Quality: integer 0 - 100 */
            if( !is_int( $quality ) or $quality < 0 or $quality > 100 ) $quality=80;
            $image = imagecreatefromjpeg( $source );
            return imagejpeg( $image, $destination, $quality );

        case 'image/gif':
            $image = imagecreatefromgif( $source );
            return imagegif( $image, $destination );

        case 'image/png':
            /* Quality: Compression integer 0(none) - 9(max) */
            if( !is_int( $quality ) or $quality < 0 or $quality > 9 )$quality=6;
            $image = imagecreatefrompng( $source );
            return imagepng( $image, $destination, $quality, $filters );

        case 'image/webp':
            /* Quality: Compression 0(lowest) - 100(highest) */
            if( !is_int( $quality ) or $quality < 0 or $quality > 100 )$quality=80;
            $image=imagecreatefromwebp( $source );
            return imagewebp( $image, $destination, $quality );

        case 'image/bmp':
            /* Quality: Boolean for compression */
            if( !is_bool( $quality ) )$quality=true;
            $image=imagecreatefrombmp( $source );
            return imagebmp( $image, $destination, $quality );

        default:exit( sprintf( 'Unknown type: %s',$info['mime'] ) );
    }
}

Korzystanie z wartości zwracanej

if( compressImage($newPath, $newPath, 60) ){ /* success */ }
else { /* Failure */ }
1
Professor Abronsius 8 marzec 2020, 09:49

We wszystkich przypadkach piszesz obraz za pomocą imagejpeg; także pliki GIF i PNG.

1
jorijnsmit 8 marzec 2020, 09:10