base64_encoded uncompressed IDAT από PNG

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27647
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από cordis » 05 Νοέμ 2011 01:10

Each 'data' element is base64_encoded uncompressed IDAT
λέει εδώ: http://www.phpkode.com/source/p/phpbb/i ... non_gd.php

ok καταλαβαίνω ποιο σημείο του PNG είναι το IDAT αλλά πως θα το πάρω uncompressed και base64_encoded;

βασικά στο συγκεκριμένο captcha θέλω να βάλω και ελληνικούς χαρακτήρες κι ο μόνος τρόπος είναι να φτιάξω τα γράμματα σε PNG, αλλά μετά θα πρέπει να πάρω το συγκεκριμένο κομμάτι που περιγράφω παραπάνω.

έχει κανείς καμία ιδέα;
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από dva_dev » 05 Νοέμ 2011 11:22

Ο πιο απλός τρόπος για μικρές εικόνες (που έχουν 1 IDAT chunk, νομίζω πάντως ότι το 40x40 που χρησιμοποιεί ο κώδικας σε καλύπτει) είναι μάλλον να χρησιμοποιήσεις το tweakpng. Να αφαιρέσεις όλα τα chunks εκτός από το IDAT και να σώσεις το png uncompressed (έχει επιλογή στα options).
Μετά διαβάζεις όλο το αρχείο σε κάποια μεταβλητή και σφάζεις τα πρώτα 16 bytes (που είναι header) και τα 4 (τελευταία = checksum).
Αυτό που μένει το κάνεις base64_encode και έχεις τα uncompressed png image data.

Αν θέλεις να το παιδέψεις παραπάνω θα πρέπει απλώς να σώσεις το png uncompressed, και να διαβάζεις τα chunks μέχρι να βρεις το "IHDR" - για να διαβάσεις τις διαστάσεις του image - και μετά να διαβάζεις τα IDAT chunks για να πάρεις τα data.

Δες στο http://www.tig12.net/downloads/apidocs/ ... ource.html τις γραμμές 120-140 περίπου

Γενικά παίζει το εξής pattern
4 bytes (data length)
4 bytes = "IDAT" (ή οποιοδήποτε άλλο chunk type, αλλά αυτό σε ενδιαφέρει κυρίως)
(data length) bytes (τα image data)
4 bytes (checksum)

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27647
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από cordis » 05 Νοέμ 2011 20:14

μάλλον το πρόβλημά μου είναι πως δεν έχω βρει κάποιον editor που να μπορεί να σώζει uncompressed PNG αρχεία, γιατί όσους έχω δοκιμάσει τα κάνουν compress και μάλλον το utility που μου έδωσες δεν τα κάνει uncompress.
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από dva_dev » 05 Νοέμ 2011 20:25

Στο options|Preferences έχεις compression level 0;

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27647
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από cordis » 05 Νοέμ 2011 20:50

ναι, αλλά από την στιγμή που του βάζω compressed PNG βλέπω ότι πάλι compressed βγάζει.. ίσως να κάνω κάτι άλλο λάθος...

μπορείς να δοκιμάσεις στο παρακάτω PNG;

προς το παρών έχω βάλει ένα σταθερό PNG με ελληνικά γράμματα για να αποφύγω τους Ινδους σπάμερς..
Συνημμένα
ο.png
ο.png (517 Ψηφιολέξεις) Προβλήθηκε 862 φορές
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από dva_dev » 06 Νοέμ 2011 14:27

Για κάνε μια δοκιμή με αυτό τον κώδικα (να έχεις σώσει την εικόνα σου σαν 8bit png, grayscale, 256 colors)

Κώδικας: Επιλογή όλων

<?php
	$filename = './_333.png';

    $i = 0;
    $chunklen = 0;
    $idat_data = '';
    $idat_len = 0;

    $pnglen = filesize&#40;$filename&#41;;
    $pngfile = file_get_contents&#40;$filename&#41;;

    $signature = substr&#40;$pngfile, 1,3&#41;;
    if &#40;$signature != 'PNG'&#41; die&#40;'not png file'&#41;;

    $i = 8;
    while &#40;&#40;$chunkname != 'IEND'&#41; && &#40;$i < $pnglen&#41;&#41;
    &#123;
	    list&#40;$chunklen&#41; = array_values&#40;unpack&#40;'N', substr&#40;$pngfile, $i,4&#41;&#41;&#41;;
	    $i += 4;
	    $chunkname = substr&#40;$pngfile, $i, 4&#41;;
	    $i += 4;
	    $chunkdata = substr&#40;$pngfile, $i, $chunklen&#41;;
	    $i += $chunklen;
	    list&#40;$chunkcrc&#41; = array_values&#40;unpack&#40;'N', substr&#40;$pngfile, $i,4&#41;&#41;&#41;;
	    $i += 4;
	    echo 'Found chunk&#58; ',$chunkname, ', len&#58;',$chunklen, ', checksum&#58;',substr&#40;'00000000'.dechex&#40;$chunkcrc&#41;, -8&#41;," \n";
	    switch &#40;$chunkname&#41;
	    &#123;
	    case 'IHDR'&#58;
			list&#40;$png_width&#41; = array_values&#40;unpack&#40;'N',substr&#40;$chunkdata,0,4&#41;&#41;&#41;;
			list&#40;$png_height&#41; = array_values&#40;unpack&#40;'N',substr&#40;$chunkdata,4,4&#41;&#41;&#41;;
			list&#40;$png_bitdepth&#41; = array_values&#40;unpack&#40;'C',substr&#40;$chunkdata,8,1&#41;&#41;&#41;;
			list&#40;$png_colourtype&#41; = array_values&#40;unpack&#40;'C',substr&#40;$chunkdata,9,1&#41;&#41;&#41;;
			list&#40;$png_compressionmethod&#41; = array_values&#40;unpack&#40;'C',substr&#40;$chunkdata,10,1&#41;&#41;&#41;;
			list&#40;$png_filtermethod&#41; = array_values&#40;unpack&#40;'C',substr&#40;$chunkdata,11,1&#41;&#41;&#41;;
			list&#40;$png_interlacemethod&#41; = array_values&#40;unpack&#40;'C',substr&#40;$chunkdata,12,1&#41;&#41;&#41;;
	    	break;
	    case 'IDAT'&#58;
	    	$idat_len += $chunklen;
	    	$idat_data .= $chunkdata;
	    	break;
		&#125;
	&#125;
	$u_idat_data = gzuncompress&#40;$idat_data&#41;;
	$u_idat_len = strlen&#40;$u_idat_data&#41;;
	$b64_idat_data = base64_encode&#40;$u_idat_data&#41;;
	
	//save compressed IDAT data
	//file_put_contents&#40;$filename.'.idat.bin',$idat_data&#41;;
	//save plain IDAT data
	//file_put_contents&#40;$filename.'.plain.idat.bin',$u_idat_data&#41;;
	//save plain base64 IDAT data
	file_put_contents&#40;$filename.'.base64.txt',$b64_idat_data&#41;;
?>
Φτιάχνει ένα αρχείο με το base64 string.
Αν έχει χρώματα η εικόνα (στα 8bits) θέλει λίγο δουλειά μάλλον γιατί δεν έχω δει καθόλου την παλέττα (PLTE). Σε true color -χωρις alpha - πρέπει να είναι εντάξει - αν και θα βγαίνει τριπλάσιο -σχεδόν- το μέγεθος.

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27647
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

base64_encoded uncompressed IDAT από PNG

Δημοσίευση από cordis » 08 Νοέμ 2011 22:25

φίλε γλύτωσα από τους Ινδούς ακόμα και με το σταθερό captcha με τους ελληνικούς χαρακτήρες και δεν το έχω κοιτάξει ακόμα αυτό που μου έδωσες. :D
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες