x_maras Δημοσ. 16 Μαΐου 2012 Δημοσ. 16 Μαΐου 2012 δν μπορώ να καταλάβω καν πως θα συντάξω τέτοιο κομμάτι :-/ Αν ο πίνακας σου ήταν ο color και περιείχε τιμές rgb τώρα θα έχεις 3 πίνακες (red, green, blue) και θα περιέχουν τιμές r, g, b αντίστοιχα παράδειγμα > //τώρα έχεις κάτι σαν το παρακάτω $rgb = imagecolorat($im, 10, 15); $color[10][15] = $rgb; //το οποίο θα το αντικαταστήσεις με 3 πίνακες $rgb = imagecolorat($im, 10, 15); $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $red[10][15] = $r; $green[10][15] = $g; $blue[10][15] = $b; υ.γ. με πρόλαβε όσο το έγραφα...
zn2709 Δημοσ. 17 Μαΐου 2012 Μέλος Δημοσ. 17 Μαΐου 2012 καλημέρα κατέληξα σε αυτό: > for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $result[$pixelx ][$pixely] = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($result[$pixelx ][$pixely] >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($result[$pixelx ][$pixely] >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $result[$pixelx ][$pixely] & 0xFF; var_dump($resultB); if(!$is_left_edge) // Το κελί Δ { $result[$pixelx ][$pixely] = imagecolorat($im, $pixelx - 1, $pixely); $cells++; } if(!$is_right_edge) // Το κελί Α { $result[$pixelx ][$pixely] = imagecolorat($im, $pixelx + 1, $pixely); $cells++; } if(!$is_top_edge) { $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx, $pixely - 1); // Το κελί Β $cells++; if(!$is_left_edge) { $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx - 1, $pixely - 1); // Το κελί ΒΔ $cells++; } if(!$is_right_edge) { $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx + 1, $pixely - 1); // Το κελί ΒΑ $cells++; } } if(!$is_down_edge) { $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx, $pixely + 1); // Το κελί N $cells++; if(!$is_left_edge) { $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx - 1, $pixely + 1); // Το κελί NΔ $cells++; } if(!$is_right_edge) { $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx + 1, $pixely + 1); // Το κελί NΑ $cells++; } } $result[$pixelx ][$pixely] = $result[$pixelx ][$pixely] / $cells; } } Είναι σωστό ή πρέπει να βάζω και τους τρεις πίνακες παντού?
computeras13 Δημοσ. 17 Μαΐου 2012 Δημοσ. 17 Μαΐου 2012 Είναι λάθος. Στην ουσία δεν κατάλαβες την λογική των τριών πινάκων. Θα έπρεπε να έχεις το παρακάτω: > for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $rgb = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $rgb & 0xFF; var_dump($resultB); if(!$is_left_edge) // Το κελί Δ { $rgb = imagecolorat($im, $pixelx - 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) // Το κελί Α { $rgb = imagecolorat($im, $pixelx + 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_top_edge) { $rgb = imagecolorat($im, $pixelx, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } if(!$is_down_edge) { $rgb = imagecolorat($im, $pixelx, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } $resultR[$pixelx ][$pixely] = $resultR[$pixelx ][$pixely] / $cells; $resultG[$pixelx ][$pixely] = $resultG[$pixelx ][$pixely] / $cells; $resultB[$pixelx ][$pixely] = $resultB[$pixelx ][$pixely] / $cells; // Εδώ θα περάσεις τα χρώματα στην νέα εικόνα. Λογικά οι παρακάτω συναρτήσεις θα δουλέψουν (όπως είπα δεν έχω δουλέψει με php. Ότι βλέπω στο API μόνο imagesetpixel($final_image, $pixelx, $pixely, imagecolorallocate($final_image, $resultR[$pixelx ][$pixely], $resultG[$pixelx ][$pixely], $resultB[$pixelx ][$pixely])); } }
zn2709 Δημοσ. 17 Μαΐου 2012 Μέλος Δημοσ. 17 Μαΐου 2012 ωραία, άρα πρέπει να μπουν παντού οι 3 πίνακες κατι απο τα τελευταια που θα σας απασχολησω, η διαιρεση με το cells γτ γινεται? :-/ και επισης, υπαρχει κανενας τροπος να δημιουργησω εικονα ξεροντας τα χρωματα καθε pixel? βρήκα αυτό Link αλλά δεν ξέρω αν θα δουλέψει ή αν μου χρειάζεται..
computeras13 Δημοσ. 17 Μαΐου 2012 Δημοσ. 17 Μαΐου 2012 Η διαίρεση γίνεται για να βγάλεις τον μέσο όρο. Σκέψου οτι θέλεις να πάρεις την μέση τιμή των 1,2,3,4 και 5. Δεν θα κάνεις (1+2+3+4+5)/5 για να την βρεις; Την ίδια λογική ακολουθείς και εδώ μόνο που εδώ οι αριθμοί σου είναι μεταξύ 0 και 255 για κάθε απόχρωση. Ο κάθε τέτοιος αριθμός δηλώνει την "ένταση" του κάθε χρώματος για να το πω απλά. Για την δεύτερή σου ερώτηση κοίτα καλύτερα τον κώδικα που σου έδωσα. Ειδικότερα προς το τέλος. Μου φαίνεται το προσπέρασες έτσι...
zn2709 Δημοσ. 18 Μαΐου 2012 Μέλος Δημοσ. 18 Μαΐου 2012 δεν το προσπέρασα έτσι εννοείται το δοκίμασα κ δεν δούλευε και έτσι ξαναρώτησα..ούτε τώρα δουλεύει και προσπαθώ μέσα απο το API όπως κ εσύ να βγάλω άκρη..κατάφερα να κάνω στρογγυλοποίηση τους πίνακες αλλά όταν κάνω ενα var_dump για να δω τι περιέχουν ναι μεν είναι όλοι ακέραιοι πλέον αλλά τους ονομάζει float: array(1) { [0]=> array(1) { [0]=> float(181) } } array(1) { [0]=> array(2) { [0]=> float(181) [1]=> float(181) } } array(1) { [0]=> array(3) { [0]=> float(181) [1]=> float(181) [2]=> float(182) } } array(1) { [0]=> array(4) { [0]=> float(181) [1]=> float(181) κοκ. είμαστε κοντά, πολύ κοντά πιστεύω :-/ >for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $rgb = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $rgb & 0xFF; if(!$is_left_edge) // Το κελί Δ { $rgb = imagecolorat($im, $pixelx - 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) // Το κελί Α { $rgb = imagecolorat($im, $pixelx + 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_top_edge) { $rgb = imagecolorat($im, $pixelx, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } if(!$is_down_edge) { $rgb = imagecolorat($im, $pixelx, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } $resultR[$pixelx ][$pixely] = $resultR[$pixelx ][$pixely] / $cells; $resultG[$pixelx ][$pixely] = $resultG[$pixelx ][$pixely] / $cells; $resultB[$pixelx ][$pixely] = $resultB[$pixelx ][$pixely] / $cells; $R[$pixelx ][$pixely] = round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $G[$pixelx ][$pixely] = round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $B[$pixelx ][$pixely] = round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); // Δεν μου εμφανίζει τίποτα, ούτε σφάλμα ούτε τίποτα. :/ imagesetpixel($im, $pixelx, $pixely, imagecolorallocate($im, $R[$pixelx ][$pixely], $G[$pixelx ][$pixely], $B[$pixelx ][$pixely])); } }
computeras13 Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 Στην τελευταία γραμμή που αλλάζεις τα pixel είναι καλύτερα να το κάνεις σε νέα εικόνα και όχι σε αυτή που τραβάς τα δεδομένα. Όπως το κάνεις τώρα θα επηρεαστούν οι τιμές των άλλων pixel. Όσο για τις τιμές που βγαίνουν float είναι απόλυτα λογικό. Όταν κάνεις στρογγυλοποίηση δεν αλλάζει το είδος της μεταβλητής. Για να γίνει αυτό πρέπει να κάνεις casting. > x = (int)y;
zn2709 Δημοσ. 18 Μαΐου 2012 Μέλος Δημοσ. 18 Μαΐου 2012 Στην τελευταία γραμμή που αλλάζεις τα pixel είναι καλύτερα να το κάνεις σε νέα εικόνα και όχι σε αυτή που τραβάς τα δεδομένα. Όπως το κάνεις τώρα θα επηρεαστούν οι τιμές των άλλων pixel. Όσο για τις τιμές που βγαίνουν float είναι απόλυτα λογικό. Όταν κάνεις στρογγυλοποίηση δεν αλλάζει το είδος της μεταβλητής. Για να γίνει αυτό πρέπει να κάνεις casting. > x = (int)y; για νεα εικονα ομως πρεπει να ξανακαλεσω imagecreatefrompng? γιατι η μεταβλητη $im δημιουργηθηκε πιο πανω στον κωδικα με τις εντολές : > $im = imagecreatefrompng("w.png"); $rgb = imagecolorat($im, 0, 5); $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; επίσης πρέπει να κάνω το casting που λες για να δημιουργηθεί η εικόνα ή είναι "προεραιτικό"?
computeras13 Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 Βασικά κάτσε να τα πάρουμε τα βήματα με την σειρά γιατί μάλλον το έχεις λίγο μπερδεμένο στο μυαλό σου. Για να κάνεις αυτό που θέλεις χρειάζεσαι δύο εικόνες. Η μια θα είναι αυτή που θα διαβάζεις και άλλη μια ίδιων διαστάσεων που θα γράφεις. Δες το σαν πίνακες. Έστω οτι έχεις έναν πίνακα ονόματι Α και θέλεις να εφαρμόσεις την τεχνική του averaging. H διαδικασία που ακολουθείς είναι η παρακάτω: Φτιάχνεις έναν νέο πίνακα (έστω Β) με ίδιες διαστάσεις με τον Α Διαβάζοντας τις τιμές από τον πίνακα Α συμπληρώνεις τον πίνακα Β με τις τιμές που υπολογίζεις Εφόσον εδώ μιλάμε για εικόνες, θα πρέπει να φτιάξεις μια δεύτερη εικόνα της οποία τα pixel θα χρωματίζεις ένα ένα. Το casting δεν είναι απαραίτητο ότι θα χρειαστεί. Μπορεί να το κάνει και αυτόματα η γλώσσα όταν θα περάσεις τα ορίσματα στην συνάρτηση. Αν δεις οτι έχεις πρόβλημα τότε κάν' το.
zn2709 Δημοσ. 18 Μαΐου 2012 Μέλος Δημοσ. 18 Μαΐου 2012 >for ($i = 0; $i < $width; $i++) {for ($j = 0; $j< $height; $j++) { $resultR[$i][$j] = 0; $resultG[$i][$j] = 0; $resultB[$i][$j] = 0; $handle[$i][$j] = 0; } } for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $rgb = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $rgb & 0xFF; if(!$is_left_edge) // Το κελί Δ { $rgb = imagecolorat($im, $pixelx - 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) // Το κελί Α { $rgb = imagecolorat($im, $pixelx + 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_top_edge) { $rgb = imagecolorat($im, $pixelx, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } if(!$is_down_edge) { $rgb = imagecolorat($im, $pixelx, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } $resultR[$pixelx ][$pixely] = $resultR[$pixelx ][$pixely] / $cells; $resultG[$pixelx ][$pixely] = $resultG[$pixelx ][$pixely] / $cells; $resultB[$pixelx ][$pixely] = $resultB[$pixelx ][$pixely] / $cells; // Εδώ θα περάσεις τα χρώματα στην νέα εικόνα. Λογικά οι παρακάτω συναρτήσεις θα δουλέψουν (όπως είπα δεν έχω δουλέψει με php. Ότι βλέπω στο API μόνο $R[$pixelx ][$pixely] = round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $G[$pixelx ][$pixely] = round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $B[$pixelx ][$pixely] = round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $R[$pixelx ][$pixely] = intval($R); $G[$pixelx ][$pixely] = intval($G); $B[$pixelx ][$pixely] = intval($; $final_im = imagecreatetruecolor($width, $height); $handle[$pixelx][$pixely] = imagesetpixel($final_im, $pixelx, $pixely, imagecolorallocate($final_im, $R[$pixelx ][$pixely], $G[$pixelx ][$pixely], $B[$pixelx ][$pixely])); header('Content-Type: image/png'); imagepng($final_im); imagedestroy($final_im); } } το αποτέλεσμα που παίρνω είναι οτι η εικονα δν μπορει να προβληθει επειδη περιεχει σφαλματα.:-/ πάλι λάθος κάνω σίγουρα αλλά ΠΟΥΥΥΥΥΥ??? YΓ ίσως λίγο καλύτερα.. >for ($i = 0; $i < $width; $i++) {for ($j = 0; $j< $height; $j++) { $resultR[$i][$j] = 0; $resultG[$i][$j] = 0; $resultB[$i][$j] = 0; $handle[$i][$j] = 0; } } for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $rgb = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $rgb & 0xFF; if(!$is_left_edge) // Το κελί Δ { $rgb = imagecolorat($im, $pixelx - 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) // Το κελί Α { $rgb = imagecolorat($im, $pixelx + 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_top_edge) { $rgb = imagecolorat($im, $pixelx, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } if(!$is_down_edge) { $rgb = imagecolorat($im, $pixelx, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } $resultR[$pixelx ][$pixely] = $resultR[$pixelx ][$pixely] / $cells; $resultG[$pixelx ][$pixely] = $resultG[$pixelx ][$pixely] / $cells; $resultB[$pixelx ][$pixely] = $resultB[$pixelx ][$pixely] / $cells; // Εδώ θα περάσεις τα χρώματα στην νέα εικόνα. Λογικά οι παρακάτω συναρτήσεις θα δουλέψουν (όπως είπα δεν έχω δουλέψει με php. Ότι βλέπω στο API μόνο $R[$pixelx ][$pixely] = round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $G[$pixelx ][$pixely] = round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $B[$pixelx ][$pixely] = round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $R[$pixelx ][$pixely] = intval($R); $G[$pixelx ][$pixely] = intval($G); $B[$pixelx ][$pixely] = intval($; $final_im = imagecreatetruecolor($width, $height); $color[$pixelx][$pixely] = imagecolorallocate($final_im, $R[$pixelx ][$pixely], $G[$pixelx ][$pixely], $B[$pixelx ][$pixely]); imagesetpixel($final_im, $pixelx, $pixely, $color[$pixelx][$pixely]); } } header('Content-Type: image/png'); imagepng($final_im); imagedestroy($final_im);
x_maras Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 χωρίς να έχω δει τα docs να κάνω μια παρατήρηση που μπορεί να είναι λάθος, αλλά δε μου κάθετε καλά όπως το έχεις. 1ον το imagepng δε θα έπρεπε να είναι έξω από τα loops; Θεωρητικά αυτή μοιάζει με την μέθοδο που θα πάρει ένα matrix και θα τον κάνει εικόνα 2ον δίνεις κάποιες τιμές στο $handle αλλά δε το χρησιμοποιείς. Μήπως πρέπει αυτό να είναι η παραμετρός σου στη function imagepng? EDIT οκ με πρόλαβες και τα διόρθωσες
zn2709 Δημοσ. 18 Μαΐου 2012 Μέλος Δημοσ. 18 Μαΐου 2012 σωστά αυτά που είπες τα πρόσεξα και τ άλλαξα..πανω απο τα loops δημιουργω την νέα εικόνα.κάτω και έξω απο αυτά την εμφανίζω και μέσα σε αυτά στον πίνακα color: $color[$pixelx][$pixely] = imagecolorallocate($final_im, $R[$pixelx ][$pixely], $G[$pixelx ][$pixely], $B[$pixelx ][$pixely]); έχω τα χρώματα για κάθε pixely και κατευθείαν τα περνάω στη νέα εικόνα με το : imagesetpixel($final_im, $pixelx, $pixely, $color[$pixelx][$pixely]); αλλά πάλι παίρνω το σφάλμα που είπα πριν να ο κώδικας ξανά: > $final_im = imagecreatetruecolor($width, $height); for ($i = 0; $i < $width; $i++) {for ($j = 0; $j< $height; $j++) { $resultR[$i][$j] = 0; $resultG[$i][$j] = 0; $resultB[$i][$j] = 0; } } for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $rgb = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $rgb & 0xFF; if(!$is_left_edge) // Το κελί Δ { $rgb = imagecolorat($im, $pixelx - 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) // Το κελί Α { $rgb = imagecolorat($im, $pixelx + 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_top_edge) { $rgb = imagecolorat($im, $pixelx, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } if(!$is_down_edge) { $rgb = imagecolorat($im, $pixelx, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } $resultR[$pixelx ][$pixely] = $resultR[$pixelx ][$pixely] / $cells; $resultG[$pixelx ][$pixely] = $resultG[$pixelx ][$pixely] / $cells; $resultB[$pixelx ][$pixely] = $resultB[$pixelx ][$pixely] / $cells; // Εδώ θα περάσεις τα χρώματα στην νέα εικόνα. Λογικά οι παρακάτω συναρτήσεις θα δουλέψουν (όπως είπα δεν έχω δουλέψει με php. Ότι βλέπω στο API μόνο $R[$pixelx ][$pixely] = round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $G[$pixelx ][$pixely] = round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $B[$pixelx ][$pixely] = round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $R[$pixelx ][$pixely] = intval($R); $G[$pixelx ][$pixely] = intval($G); $B[$pixelx ][$pixely] = intval($; $color[$pixelx][$pixely] = imagecolorallocate($final_im, $R[$pixelx ][$pixely], $G[$pixelx ][$pixely], $B[$pixelx ][$pixely]); imagesetpixel($final_im, $pixelx, $pixely, $color[$pixelx][$pixely]); } } header('Content-Type: image/png'); imagepng($final_im); νιώθω πως είμαστε κοντά αλλά..:-/
x_maras Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 εγώ τρέχω το κώδικά σού και δε μου εμφανίζει κάποιο λάθος αλλά μια μαύρη εικόνα 32x32 ...
zn2709 Δημοσ. 18 Μαΐου 2012 Μέλος Δημοσ. 18 Μαΐου 2012 εγώ τρέχω το κώδικά σού και δε μου εμφανίζει κάποιο λάθος αλλά μια μαύρη εικόνα 32x32 ... μα πως? σε τι browser? ΥΓ ολόκληρο το php αρχείο είναι αυτό: ><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7" /> <title>Untitled Document</title> </head> <body> <?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } ?> <br /> <br /> <?php $im = imagecreatefrompng("w.png"); $rgb = imagecolorat($im, 0, 5); $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; var_dump($r, $g, $; ?> <br /> <?php list($width, $height, $type, $attr) = getimagesize("w.png"); echo "$im width " .$width; echo "<BR>"; echo "$im height " .$height; echo "<BR>"; echo "$im type " .$type; echo "<BR>"; echo "Attribute " .$attr; $final_im = imagecreatetruecolor($width, $height); for ($i = 0; $i < $width; $i++) {for ($j = 0; $j< $height; $j++) { $resultR[$i][$j] = 0; $resultG[$i][$j] = 0; $resultB[$i][$j] = 0; } } for($pixelx = 0; $pixelx < $width; $pixelx++) { for($pixely = 0 ; $pixely < $height; $pixely++) { $cells = 1; $is_left_edge = $pixelx == 0; $is_right_edge = $pixelx == $width - 1; $is_top_edge = $pixely == 0; $is_down_edge = $pixely == $height -1; $rgb = imagecolorat($im, $pixelx, $pixely); $resultR[$pixelx ][$pixely] = ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] = ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] = $rgb & 0xFF; if(!$is_left_edge) // Το κελί Δ { $rgb = imagecolorat($im, $pixelx - 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) // Το κελί Α { $rgb = imagecolorat($im, $pixelx + 1, $pixely); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_top_edge) { $rgb = imagecolorat($im, $pixelx, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely - 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } if(!$is_down_edge) { $rgb = imagecolorat($im, $pixelx, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; if(!$is_left_edge) { $rgb = imagecolorat($im, $pixelx - 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } if(!$is_right_edge) { $rgb = imagecolorat($im, $pixelx + 1, $pixely + 1); $resultR[$pixelx ][$pixely] += ($rgb >> 16) & 0xFF; $resultG[$pixelx ][$pixely] += ($rgb >> 8) & 0xFF; $resultB[$pixelx ][$pixely] += $rgb & 0xFF; $cells++; } } $resultR[$pixelx ][$pixely] = $resultR[$pixelx ][$pixely] / $cells; $resultG[$pixelx ][$pixely] = $resultG[$pixelx ][$pixely] / $cells; $resultB[$pixelx ][$pixely] = $resultB[$pixelx ][$pixely] / $cells; // Εδώ θα περάσεις τα χρώματα στην νέα εικόνα. Λογικά οι παρακάτω συναρτήσεις θα δουλέψουν (όπως είπα δεν έχω δουλέψει με php. Ότι βλέπω στο API μόνο $R[$pixelx ][$pixely] = round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $G[$pixelx ][$pixely] = round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $B[$pixelx ][$pixely] = round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $R[$pixelx ][$pixely] = intval($R); $G[$pixelx ][$pixely] = intval($G); $B[$pixelx ][$pixely] = intval($; $color[$pixelx][$pixely] = imagecolorallocate($final_im, $R[$pixelx ][$pixely], $G[$pixelx ][$pixely], $B[$pixelx ][$pixely]); imagesetpixel($final_im, $pixelx, $pixely, $color[$pixelx][$pixely]); } } header('Content-Type: image/png'); imagepng($final_im); ?> </body> </html> αν θέλεις κατέβασέ τα κιόλας και βάλτα στο xampp στον φάκελο htdocs..τα επισυνάπτω μαζί με την εικόνα.. sat.html sat1.php
computeras13 Δημοσ. 18 Μαΐου 2012 Δημοσ. 18 Μαΐου 2012 Το casting το κάνεις τελείως λάθος. Γι' αυτό και εμφανίζει μια μαύρη εικόνα. Θέτεις όλα τα pixel να έχουν το ίδιο χρώμα. Εσύ έχεις >$R[$pixelx ][$pixely] = round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $G[$pixelx ][$pixely] = round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $B[$pixelx ][$pixely] = round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP); $R[$pixelx ][$pixely] = intval($R); $G[$pixelx ][$pixely] = intval($G); $B[$pixelx ][$pixely] = intval($; Το σωστό είναι >$R[$pixelx ][$pixely] = intval(round($resultR[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP)); $G[$pixelx ][$pixely] =intval( round($resultG[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP)); $B[$pixelx ][$pixely] = intval(round($resultB[$pixelx ][$pixely], 0, PHP_ROUND_HALF_UP));
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα