TransWikia.com

Generar imagen php

Stack Overflow en español Asked on November 4, 2021

Estoy teniendo problemas para generar una imagen desde PHP. Mi problema es que se genera el archivo perfectamente con la estructura que necesito, pero al abrir el archivo de imagen aparece el siguiente mensaje: "Parece que el formato de este archivo no es compatible." Lo estoy realizando con Laravel

Adjunto código de como genero la imagen y la guardo en la BD (el nombre de la imagen)

HTML:

<div class="col-md-5">
    <div class="card-header">Firma</div>
    <input type="color" class="js-color-picker  color-picker">
    <input type="range" class="js-line-range" min="1" max="72" value="1">
    <label class="js-range-value">1</label>Px
    <canvas class="js-paint paint-canvas" id="canvas" name="firma" width="400" height="300"></canvas>
    <input type="hidden" name="_token" id="token" value="{{ csrf_token() }}">
</div>

Controller:

public function crearPaciente(Request $request){

    $nombre = $request->get('nombre');
    $apellidos = $request->get('apellidos');
    $dni = $request->get('dni');
    $fechaNacimiento = $request->get('fechaNacimiento');
    $lugarNacimiento = $request->get('lugarNacimiento');
    $direccion = $request->get('direccion');
    $codigoPostal = $request->get('codigoPostal');

    $telefonoFijo = $request->get('telefonoFijo');
    $telefonoMovil = $request->get('telefonoMovil');
    $compania = $request->get('compania');

    

    //obtenemos la fecha de firma
    $fecha = CarbonCarbon::now();
    $fechaFinal = $fecha->toDateString();

    $firma = $request->get('dataURL');

    $this->generateImage($firma, $nombre, $apellidos);

    $pacienteFirma = $nombre.$apellidos.".png";

    $guardarFirma = str_replace(' ', '', $pacienteFirma);

    
    $data = array('nombre'=>$nombre,
                  "apellidos"=>$apellidos,
                  "dni"=>$dni,
                  "fecha_nacimiento"=>$fechaNacimiento,
                  "lugar_nacimiento"=>$lugarNacimiento,
                  "direccion"=>$direccion,
                  "cod_postal"=>$codigoPostal,
                  "tlf1"=>$telefonoFijo,
                  "tlf2"=>$telefonoMovil,
                  "compania"=>$compania,
                  );

    $consentimiento = array('fechaFirma' => $fechaFinal,
                            'firma' => $guardarFirma
                           );


    DB::table('pacientes')->insert($data);
    DB::table('lopds')->insert($consentimiento);

Capturo el resquest del canvas

$firma = $request->get('dataURL');

$this->generateImage($firma, $nombre, $apellidos);

Función "generateImage"

public function generateImage($img, $nombre, $apellidos){

    $cadenaNombre = $nombre.$apellidos;
    
    $nombreApellidos = str_replace(' ', '', $cadenaNombre);

    $path = "images/".$nombreApellidos.".png";
    
    $imgTran1 = str_replace('data:image/png;base64,', '', $img);
    $imgTran2 = str_replace(' ', '+', $img);
    $data = base64_decode($imgTran2);

    $success = file_put_contents($path, $data);
}

Tengo que decir, que antes de transformar la imagen, la cadena resultante del canvas es una cadena en base64, como se puede ver en la variable $imgTran1.

Gracias de antemano por la ayuda, ya que no se que puede estar fallando para que no se muestre la imagen. Al devolverla en html de nuevo, tampoco se muestra.

Un saludo y gracias de nuevo

One Answer

La imagen convertida se ha utilizado incorrectamente, en la segunda conversion/reemplazo se utiliza la misma imagen inicial ($img) como fuente, por lo que data:image/png;base64 queda en la imagen final. (cambia $img por $imgTran1)

$imgTran1 = str_replace('data:image/png;base64,', '', $img);
$imgTran2 = str_replace(' ', '+', $imgTran1);
$data = base64_decode($imgTran2);

Answered by F.Igor on November 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP