Domanda

Sono stato incuriosito da Questa discussione di ridimensionamento dell'immagine e successivamente scoperto Che il codice PHP che sto usando per creare miniature da immagini cariche soffermate dallo stesso problema. Ho deciso di provare la correzione PHP pubblicata vicino al fondo (convertire gamma da 2,2 a 1.0, ridimensionando l'immagine, convertendo la conversione di Gamma da 1,0 a 2.2). Ciò funziona per risolvere la questione rilevata nell'articolo, tuttavia questa modifica al codice ha lo sfortunato effetto collaterale di abbattere la trasparenza del canale PNG Alpha.

Ecco il codice che ho con la correzione gamma in posizione.

<?php
$image = imagecreatefrompng($source_file);
$resized_image = imagecreatetruecolor($new_width, $new_height);
imagealphablending($resized_image, false);
imagesavealpha($resized_image, true);
imagegammacorrect($image, 2.2, 1.0);
imagecopyresampled($resized_image, $image, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height);
imagegammacorrect($resized_image, 1.0, 2.2);
imagepng($resized_image, $dest_file);
?>
.

Qualcuno sa come ridimensionare l'immagine, impiegando il trucco di correzione gamma, pur mantenendo la trasparenza del canale alfa dell'immagine originale?

Modifica

Immagini di esempio:

    .
  1. File originale - PNG con trasparenza canale alfa
  2. file ridimensionato con entrambe le chiamate di funzioneGammaCorrect () commentate
  3. File ridimensionato con entrambe le chiamate di funzioneGammaCorrect () in posizione
  4. Puoi vedere che la trasparenza va bene finché non si tenta di correggere la gamma. (il modo più semplice per vedere la trasparenza sta lavorando qui sotto è ispezionare il tag del paragrafo avvolto attorno alle immagini e aggiungere uno sfondo: nero; al suo attributo di stile tramite Firebug o simili.)

    immagine originale http://ender.hosting.emarketsouth.com/images /test-image.png . Nessuna correzione gamma http://ender.hosting.emarketsouth .com / immagini / test-image-ridimension-no-gamma.png Gamma corrette - Nessuna trasparenza http://ender.hosting.emarketSouth.com /images/test-image-resized.png

È stato utile?

Soluzione

Ecco alcuni codice che funziona. Fondamentalmente, separa il canale alfa, ridimensiona l'immagine utilizzando la gamma corretta, ridimensiona il canale alfa senza corretto corretto, quindi copia il canale alfa sull'immagine ridimensionata eseguita con gamma corretta. .

La mia ipotesi è che la funzione ImageGammaCorrect () ha un bug. Forse Gamma si applica solo a RGB e GD tenta di fare lo stesso calcolo anche al canale alfa? La teoria dei colori non è il mio forte.

Comunque, ecco il codice. Purtroppo non ho potuto trovare un modo migliore per separare i canali piuttosto che loop sui pixel uno per uno. Oh bene ...

<?php
// Load image
$image = imagecreatefrompng('test-image.png');

// Create destination
$resized_image = imagecreatetruecolor(100, 100);
imagealphablending($resized_image, false); // Overwrite alpha
imagesavealpha($resized_image, true);

// Create a separate alpha channel
$alpha_image = imagecreatetruecolor(200, 200);
imagealphablending($alpha_image, false); // Overwrite alpha
imagesavealpha($alpha_image, true);

for ($x = 0; $x < 200; $x++) {
    for ($y = 0; $y < 200; $y++) {
        $alpha = (imagecolorat($image, $x, $y) >> 24) & 0xFF;
        $color = imagecolorallocatealpha($alpha_image, 0, 0, 0, $alpha);
        imagesetpixel($alpha_image, $x, $y, $color);
    }
}

// Resize image to destination, using gamma correction
imagegammacorrect($image, 2.2, 1.0);
imagecopyresampled($resized_image, $image, 0, 0, 0, 0, 100, 100, 200, 200);
imagegammacorrect($resized_image, 1.0, 2.2);

// Resize alpha channel
$alpha_resized_image = imagecreatetruecolor(200, 200);
imagealphablending($alpha_resized_image, false);
imagesavealpha($alpha_resized_image, true);

imagecopyresampled($alpha_resized_image, $alpha_image, 0, 0, 0, 0, 100, 100, 200, 200);

// Copy alpha channel back to resized image
for ($x = 0; $x < 100; $x++) {
    for ($y = 0; $y < 100; $y++) {
        $alpha = (imagecolorat($alpha_resized_image, $x, $y) >> 24) & 0xFF;
        $rgb = imagecolorat($resized_image, $x, $y);
        $r = ($rgb >> 16 ) & 0xFF;
        $g = ($rgb >> 8 ) & 0xFF;
        $b = $rgb & 0xFF;
        $color = imagecolorallocatealpha($resized_image, $r, $g, $b, $alpha);
        imagesetpixel($resized_image, $x, $y, $color);
    }
}

imagepng($resized_image, 'test-image-scaled.png');
?>
.

Sostituire i valori con codifica rigida con le variabili ovviamente ... ed ecco il risultato che ottengo usando la tua immagine e il mio codice:

 Immagine ridimensionata
(Fonte: jejik.com )

Altri suggerimenti

C'è un problema con ImageCopySampled () e Trasparenza.Dai un'occhiata a Questo commento su php.net per aPossibile soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top