Visualizzazione risultati 1 fino 12 di 12

Discussione: Creare immagine attraverso coordinate nel db

  1. #1
    Guest

    Predefinito Creare immagine attraverso coordinate nel db

    Salve a tutti,
    come da titolo stavo cercando di creare un'immagine dando vari colori ai pixel (quadrati 10x10) in base a delle coordinate estratte dal db...
    Ho provato facendoli creare un div 10x10 per ogni record (1'400'000) ma sembra essere troppo pesante per il browser, ho provato anche con degli span ma pare la stessa cosa.
    Volevo quindi chiedervi se conoscevate un metodo alternativo e molto meno leggero per fare una cosa del genere.
    Ho provato anche con imagesetpixel ma pare che non regga 9000 pixel :S

    Saluti e grazie per ogni aiuto!

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Se ciò che devi fare è creare un'immagine, probabilmente lo strumento migliore è phpGD.
    Non mi è ben chiaro come l'immagine debba essere creata, ovvero cosa stai memorizzando nel database e in che modo questo deve essere mostrato.

  3. #3
    Guest

    Predefinito

    Codice PHP:
    $query = mysql_query("SELECT * FROM coordinates");
    while(
    $val = mysql_fetch_array($query)){
    if(
    $val['type'] == 1){
    echo
    ' <div style="position:absolute;height:10px;width:10px;background:black;top:'.$val['y'].'px;left:'.$val['x'].'px;"></div> ';
    }else if(
    $val['type'] == 2){
    echo
    ' <div style="position:absolute;height:10px;width:10px;background:red;top:'.$val['y'].'px;left:'.$val['x'].'px;"></div> ';
    }
    }
    Questo è un esempio di cosa dovrebbe fare, se il record estratto dal db ha type=1 allora mi fa il quadratino nero nella coordinata x-y, se il type è 2 lo fa rosso, e via così...
    In questo modo mi crea, quadratino per quadratino tutta l'immagine, tipo una mappa...

    Ma imagecreate funziona anche con tantissimi pixel? io provavo a creare un'immagine in questo modo:
    Codice PHP:
    $maxx = mysql_fetch_array(mysql_query("SELECT MAX(x) FROM coordinates"));
    $maxy = mysql_fetch_array(mysql_query("SELECT MAX(y) FROM coordinates" ));
    $img = imagecreate(maxx[0], $maxy[0]);
    Ma mi dava errore del server..
    Ultima modifica di competenzepertutti : 31-12-2015 alle ore 20.03.58

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,132

    Predefinito

    Come diceva mzanella, una buona soluzione sarebbe quella di usare le librerie GD.

    In particolare nel tuo caso potrebbe andar bene la funzione imagefilledrectangle() che disegna un rettangolo pieno. Oppure potrebbe esserti utile settare pixel per pixel con la imagesetpixel()

    Sono molto semplici da utilizzare, da un'occhiata agli esempi che ci sono nelle pagine che ti ho linkato.

    Ciao!

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Citazione Originalmente inviato da competenzepertutti Visualizza messaggio
    Ma imagecreate funziona anche con tantissimi pixel? io provavo a creare un'immagine in questo modo:
    ...
    Ma mi dava errore del server..
    "Tantissimi" è relativo, ma se stiamo parlando di 1400000 record (quindi indicativamente un'immagine 1200x1200) dovrebbe essere gestibile.
    Qualche informazione in più sull'errore? I valori di max x e y sono corretti?

  6. #6
    Guest

    Predefinito

    Mi dovrebbe creare un'immagine di circa 15'000 x 15'000px, dici che è una cosa fattibile?
    Comunque non so cosa dirti riguardo l'errore, uso IIS e chrome, mi viene solo scritto errore del server (500)...

    Codice usato:
    Codice PHP:
    $con = mysqli_connect("localhost", "root", "", "php");
    $caselle = mysqli_query($con, "SELECT * FROM coord WHERE z = 0");
    $xx = mysqli_fetch_array(mysqli_query($con, "SELECT MAX(x) FROM coord"));
    $yy = mysqli_fetch_array(mysqli_query($con, "SELECT MAX(y) FROM coord"));
    $x = $xx[0];
    $y = $yy[0];
    $gd = imagecreate($x, $y);
    $red = imagecolorallocate($gd, 255, 0, 0);
    while(
    $ff = mysqli_fetch_array($caselle)){
    imagesetpixel($gd, round($ff['x']),round($ff['y']), $red);
    }
    Ultima modifica di competenzepertutti : 31-12-2015 alle ore 21.39.06

  7. #7
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    15000 x 15000 è troppo, gli script PHP hanno un limite alla quantità di memoria utilizzabile (su Altervista mi sembra 256 MB).
    Immagini così grandi difficilmente sono realmente necessarie... le TAC in alta definizione negli ospedali sono più piccole!
    Probabilmente è il caso di riscalare tutto portandoti al massimo a 5000x5000 (anche 1000x1000, dipende da cosa vuoi ottenere), ad esempio leggendo dal database "blocchi" di dimensione 3 x 3 e considerando il colore medio.

    Tieni conto che, più è grande l'immagine generata, più lenta sarà la visualizzazione...

  8. #8
    Guest

    Predefinito

    Il codice che ho postato è comunque corretto?

  9. #9
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    A prima vista direi di sì.

  10. #10
    Guest

    Predefinito

    Sto facendo delle prove, ma sia molto più efficente farlo con l'html, anche se gli oggetti creabili ho notato che sono limitati, ovvero piu caselle gli faccio selezionare e più l'immagine mi viene tagliata.
    Con imagesetpixel anche limitando la query a 100 elementi sta tantissimo a crearla...
    Magari con altri linguaggi si riesce a fare qualcosa di meglio? avete qualche idea?

  11. #11
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Quale che sia il metodo scelto, i numeri in questione sono piuttosto alti...
    Sconsiglio HTML, prevalentemente perché:
    • ciò che ottieni alla fine non è un'immagine, quindi puoi avere difficoltà a manipolarla, gli utenti non possono copiarla/salvarla, ed eventuali regole nei fogli di stile possono causare problemi (ad es. se definisci border, margin o padding) (i puristi del web semantico poi avrebbero altre obiezioni, ma le lascio a loro)
    • generi un DOM tree enorme, con conseguenti rallentamenti nei tempi di caricamento e di visualizzazione


    Strano che la generazione dell'immagine sia lenta. Con questo codice generi un'immagine 5000x5000 con mezzo milione di punti quasi istantaneamente:
    Codice PHP:
    <?php
    header
    ("Content-Type: image/png");
    $points = [];
    $size = 5000;
    $npoints = 500000;

    // Generates points (or read them from database)
    for ($i = 0; $i < $npoints; $i++) {
    $points[$i] = ['x' => round(rand(0, $size)), 'y' => round(rand(0, $size)), 'c' => round(rand(0, 9))];
    }


    // Creates image and allocates colors
    $img = imagecreate($size, $size);
    imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));
    $colors = [
    imagecolorallocate($img, 255, 0, 0),
    imagecolorallocate($img, 0, 255, 0),
    imagecolorallocate($img, 0, 0, 255),
    imagecolorallocate($img, 255, 255, 0),
    imagecolorallocate($img, 0, 255, 255),
    imagecolorallocate($img, 255, 0, 255),
    imagecolorallocate($img, 255, 255, 255),
    imagecolorallocate($img, 0, 0, 0),
    imagecolorallocate($img, 128, 128, 128),
    imagecolorallocate($img, 64, 64, 64)
    ];


    // Draw points
    foreach ($points as $point) {
    imagesetpixel($img, $point['x'], $point['y'], $colors[$point['c']]);
    }


    // Outputs image
    imagepng($img);
    imagedestroy($img);
    ?>
    Sicuro che il collo di bottiglia sia nella creazione dell'immagine piuttosto che nella lettura dal database?

  12. #12
    Guest

    Predefinito

    Col tuo esempio son riuscito a fare qualcosa, ma comunque ho visto che è troppo pesante, infatti se gli faccio selezionare tutti i record rischio che il browser crashi...

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •