2012-08-29 14 views
7

He estado tratando de hacer que la transparencia funcione con mi aplicación (que cambia el tamaño de las imágenes dinámicamente antes de almacenarlas) y creo que finalmente reduje el problema después de mucha mala dirección imagealphablending y imagesavealpha. ¡La imagen de origen nunca se carga con la transparencia adecuada!PHP GD imagecreatefromstring descarta transparencia

// With this line, the output image has no transparency (where it should be 
// transparent, colors bleed out randomly or it's completely black, depending 
// on the image) 
$img = imagecreatefromstring($fileData); 
// With this line, it works as expected. 
$img = imagecreatefrompng($fileName); 

// Blah blah blah, lots of image resize code into $img2 goes here; I finally 
// tried just outputting $img instead. 

header('Content-Type: image/png'); 
imagealphablending($img, FALSE); 
imagesavealpha($img, TRUE); 
imagepng($img); 

imagedestroy($img); 

Sería una dificultad arquitectónica seria cargar la imagen de un archivo; este código se usa con una API JSON que se consulta desde una aplicación de iPhone, y es más fácil en este caso (y más consistente) cargar imágenes como cadenas codificadas en base64 en los datos POST. ¿Tengo absolutamente necesito para almacenar de alguna manera la imagen como un archivo (solo para que PHP pueda cargarla en la memoria de nuevo)? ¿Existe alguna forma de crear un Stream desde $fileData que se pueda pasar al imagecreatefrompng?

+0

No se puede reproducir el problema en 'PHP 5.3.10/GD 2.0', Funcionando bien. ¿Qué versiones estás usando? Podría provenir de otra cosa. ¿Entrada corrupta a PNG? ¿Cómo la aplicación de iPhone carga una imagen de mala calidad? Solo tomas en la oscuridad – Touki

+0

Probé esto en 'PHP 5.3.16-1 ~ dotdeb.0' (con Suhosin) con' GD 2.0.34' (compatible con 2.0.34) en mi caja de Debian, y cuando ejecuté 'imagepng 'las partes transparentes eran negras. Esto sucedió cuando usé 'imagecreatefromstring' o' imagecreatefrompng'. –

+0

Estoy en PHP 5.3.10/GD (compatible con 2.0.34). – meustrus

Respuesta

5

Blech, esto resultó ser en última instancia, debido a una llamada GD totalmente separada que validaba las cargas de imágenes. Olvidé agregar imagealphablending y imagesavealpha a ESE código, y estaba creando una nueva imagen que luego pasó al código de cambio de tamaño. Lo cual probablemente debería ser cambiado de todos modos. Muchas gracias a goldenparrot por el excelente método de convertir una cadena en un nombre de archivo.

+0

gracias a php-devs/\ – Prasanth

2

¿Debo almacenar la imagen como un archivo (solo para que PHP pueda volver a cargarla en la memoria)?

Documentation dice:

Usted puede utilizar data:// protocolo de PHP V5.2.0

Ejemplo:

// prints "I love PHP" 
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo='); 
+1

Debería poder hacer '$ img = imagecreatefrompng ('data: // image/png; base64, '. $ base64Image); ' –

2

se puede utilizar este código:

$new = imagecreatetruecolor($width, $height); 

// preserve transparency 

imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127)); 

imagealphablending($new, false); 

imagesavealpha($new, true); 

imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); 

imagepng($new); 

imagedestroy($new); 

Hará una imagen transparente para usted. Buena suerte !

+1

¿Has leído la pregunta o alguna de las respuestas? – meustrus

+0

Esto lo armó todo para mí. Gracias. –

Cuestiones relacionadas