Autor Zpráva
swetko
Profil
Dobrý deň,
vykresľujem obrázok cez Canvas.
Chcem ho uložiť na server ako PNG. Keď dám do Canvasu vpísať text, obrázok sa uloží. Keď však vkladám do Canvasu obrázok, nefunguje to.
Zaujímavé je, že keď dám fillText pred alebo po funkcii pozadie-drawImage, uloží sa obrázok na serveri ako biely(priehľadný) z textom - vtedy sa ale v samotnom plátne text nezobrazí, je prekrytý obrázkom. Akonáhle dám fillText do pozadie-drawImage, vykreslí sa na plátne, ale obrázok na serveri je prázdny - prázdne DataURL?

Prikladám zdrojový kód(komplet html,js,php):
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<canvas id="platno" width="800" height="600"></canvas>
       
<script type="text/javascript">
var canvas = document.getElementById("platno");
var context = canvas.getContext('2d');

var pozadie = new Image();
pozadie.onload = function() {
context.drawImage(pozadie, 0, 0);

context.fillStyle = '#ff875c';context.font = 'normal 75pt sans-serif';
context.fillText('blablabla', 140, 215);
};
pozadie.src = 'obr1.png';


var canvasData = canvas.toDataURL("image/png");
var postData = "canvasData="+canvasData;

var ajax = new XMLHttpRequest();
ajax.open("POST",'index.php',true);
ajax.setRequestHeader('Content-Type', 'canvas/upload');

ajax.send(postData);
</script>

<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){
$imageData=$GLOBALS['HTTP_RAW_POST_DATA'];

$filteredData=substr($imageData, strpos($imageData, ",")+1);

$unencodedData=base64_decode($filteredData);

$fp = fopen( 'test.png', 'wb' );
fwrite( $fp, $unencodedData);
fclose( $fp );
}
?>    
</body>
</html>

Neviem s tým pohnúť.
Ďakujem za rady.
Chamurappi
Profil
Reaguji na swetka:
Keď však vkladám do Canvasu obrázok, nefunguje to.
Je ten obrázek na stejné doméně? Uvedený kód říká, že ano, ale popisovaný projev chyby naznačuje… hm, ne, ten projev mě mate. Kdyby byl obrázek na jiné doméně, vyvolalo by canvas.toDataURL výjimku, v tom případě by se ale AJAXem nic neposlalo. Jestli se skutečně posílá prázdný řetězec, pro to žádné vysvětlení nemám.

Aha, teď mě to trklo. Ty posíláš AJAXem obsah <canvas>u dřív, než nastane onload obrázku pozadie. Takže logicky v tu chvíli je ještě <canvas> prázdný.

ajax.setRequestHeader('Content-Type', 'canvas/upload');
Co to je za MIME typ? :-)
swetko
Profil
Chamurappi:
Ďakujem krásne za usmernenie, už sa to pohlo.

Co to je za MIME typ? :-)
Priznám sa zahanbene, celé je to pozliepané z webu.
snazimse
Profil
Chamurappi:
Aha, teď mě to trklo. Ty posíláš AJAXem obsah <canvas>u dřív, než nastane onload obrázku pozadie.

A proč vlastně Javascript prvně vypíše obsah mimo funkci onload v principu, kvůli době toho načtění, se to asi láme těsně? Odhaduji, že funkce onload se zavolá, až po načtění úplně všeho.Je to tak?
Chamurappi
Profil
Reaguji na snazimse:
v principu, kvůli době toho načtění, se to asi láme těsně?
Nejsem si jistý, na co se ptáš. Nejprve doběhne blok příkazů na řádcích 9 až 29, během něhož se začne načítat obrázek… a pak teprve po jeho načtení se vyvolá funkce pozadie.onload.
Je (nebo aspoň dříve bylo) možné, že prohlížeč vyvolá onload hned v okamžiku, kdy se nastaví pozadie.src, pokud obrázek má v keši.

Odhaduji, že funkce onload se zavolá, až po načtění úplně všeho.
Funkce v pozadie.onload se vyvolá po donačtení obrázku v <img> elementu v proměnné pozadie.
snazimse
Profil
Chamurappi:

No šlo mi o to, že to nebude o moc, ale jen v řádu pár ms. Kvůli načtení toho obrázku se to nevykoná dříve, jinak by k tomu mohlo teoreticky dojít.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: