Estoy usando la herramienta JavaScript "Canvas2Image" de Nihilogic para convertir dibujos de lienzo en imágenes PNG. Lo que necesito ahora es convertir esas cadenas base64 que genera esta herramienta, en archivos PNG reales en el servidor, usando PHP.
En resumen, lo que estoy haciendo actualmente es generar un archivo en el lado del cliente usando Canvas2Image, luego recuperar los datos codificados en base64 y enviarlos al servidor usando AJAX:
// Generate the image file
var image = Canvas2Image.saveAsPNG(canvas, true);
image.id = "canvasimage";
canvas.parentNode.replaceChild(image, canvas);
var url = 'hidden.php',
data = $('#canvasimage').attr('src');
$.ajax({
type: "POST",
url: url,
dataType: 'text',
data: {
base64data : data
}
});
En este punto, "hidden.php" recibe un bloque de datos que parece datos: image / png; base64, iVBORw0KGgoAAAANSUhEUgAABE ...
A partir de este momento, estoy bastante perplejo. Por lo que he leído, creo que se supone que debo usar la función imagecreatefromstring de PHP , pero no estoy seguro de cómo crear una imagen PNG real a partir de la cadena codificada en base64 y almacenarla en mi servidor. Por favor ayuda!
fuente
Respuestas:
Necesita extraer los datos de la imagen base64 de esa cadena, decodificarla y luego puede guardarla en el disco, no necesita GD ya que ya es un png.
Y como una frase:
Un método eficiente para extraer, decodificar y verificar errores es:
fuente
$type
recibe un valor de la explosión, dependiendo de si se trata de datos: image / jpg o data: image / png etc.Prueba esto:
file_put_contents docs
fuente
data:image/png;base64,
que rompe el archivo.data:image/png;base64,
entonces la cadena a la que está pasandobase64_decode
no es válida base64. Solo necesita enviar los datos, que es lo que ilustra la respuesta de drew010. No hay nada roto con esta respuesta. No puede copiar y pegar sin comprender y esperar que "simplemente funcione".Tuve que reemplazar espacios con símbolos más
str_replace(' ', '+', $img);
para que esto funcionara.Aquí está el código completo
Espero que ayude.
fuente
$img = str_replace(' ', '+', $img);
me ayudó mucho, gracias! ¿Por qué tengo que convertir el espacio a "+" antes?Vale la pena decir que el tema discutido está documentado en RFC 2397 - El esquema de URL de "datos" ( https://tools.ietf.org/html/rfc2397 )
Debido a esto, PHP tiene una forma nativa de manejar dichos datos: "data: stream wrapper" ( http://php.net/manual/en/wrappers.data.php )
Para que pueda manipular fácilmente sus datos con secuencias PHP:
fuente
preg_replace
+file_put_contents
?Bueno, su solución anterior depende de que la imagen sea un archivo jpeg. Para una solución general usé
fuente
Tomada la idea @ dre010, la he extendido a otra función que funciona con cualquier tipo de imagen: PNG, JPG, JPEG o GIF y le da un nombre único al nombre de archivo
La función separa los datos de imagen y el tipo de imagen
fuente
Preocupaciones totales:
fuente
Solución unidireccional.
fuente
basado en el ejemplo drew010 hice un ejemplo de trabajo para facilitar la comprensión.
fuente
prueba esto...
fuente
Este código funciona para mí, verifique el siguiente código:
fuente
Esta función debería funcionar. esto tiene el parámetro de foto que contiene la cadena base64 y también la ruta a un directorio de imagen existente si ya tiene una imagen existente que desea desvincular mientras guarda la nueva.
fuente
Es sencillo :
Imaginemos que está intentando cargar un archivo dentro de js framework, solicitud ajax o aplicación móvil (lado del cliente)
Aquí cómo hacerlo usando PHP
fuente
Si desea cambiar el nombre de las imágenes al azar y almacenar la ruta de la imagen en la base de datos como blob y la imagen en sí en las carpetas, esta solución lo ayudará. Los usuarios de su sitio web pueden almacenar tantas imágenes como quieran, mientras que las imágenes se renombrarán aleatoriamente por razones de seguridad.
Código php
Genere varchars aleatorios para usar como nombre de imagen.
Obtenga la extensión de datos de imagen y la parte base_64 (parte después de los datos: image / png; base64,) de la imagen.
fuente
PHP ya tiene un tratamiento justo base64 -> transformación de archivo
Solía hacerlo de esta manera:
fuente