Προς το περιεχόμενο

Smooth image με averaging


zn2709

Προτεινόμενες αναρτήσεις

δν μπορώ να καταλάβω καν πως θα συντάξω τέτοιο κομμάτι :-/

 

Αν ο πίνακας σου ήταν ο 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;

 

 

υ.γ. με πρόλαβε όσο το έγραφα... :-(

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 95
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

καλημέρα :)

κατέληξα σε αυτό:

>
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;  
 } 
} 

 

Είναι σωστό ή πρέπει να βάζω και τους τρεις πίνακες παντού?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Είναι λάθος. Στην ουσία δεν κατάλαβες την λογική των τριών πινάκων.

 

Θα έπρεπε να έχεις το παρακάτω:

>

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]));
 } 
} 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ωραία, άρα πρέπει να μπουν παντού οι 3 πίνακες :) κατι απο τα τελευταια που θα σας απασχολησω, η διαιρεση με το cells γτ γινεται? :-/ και επισης, υπαρχει κανενας τροπος να δημιουργησω εικονα ξεροντας τα χρωματα καθε pixel?

 

βρήκα αυτό Link αλλά δεν ξέρω αν θα δουλέψει ή αν μου χρειάζεται..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η διαίρεση γίνεται για να βγάλεις τον μέσο όρο. Σκέψου οτι θέλεις να πάρεις την μέση τιμή των 1,2,3,4 και 5. Δεν θα κάνεις (1+2+3+4+5)/5 για να την βρεις; Την ίδια λογική ακολουθείς και εδώ μόνο που εδώ οι αριθμοί σου είναι μεταξύ 0 και 255 για κάθε απόχρωση. Ο κάθε τέτοιος αριθμός δηλώνει την "ένταση" του κάθε χρώματος για να το πω απλά.

 

Για την δεύτερή σου ερώτηση κοίτα καλύτερα τον κώδικα που σου έδωσα. Ειδικότερα προς το τέλος. Μου φαίνεται το προσπέρασες έτσι...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

δεν το προσπέρασα έτσι εννοείται :) το δοκίμασα κ δεν δούλευε και έτσι ξαναρώτησα..ούτε τώρα δουλεύει και προσπαθώ μέσα απο το 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]));
} 
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στην τελευταία γραμμή που αλλάζεις τα pixel είναι καλύτερα να το κάνεις σε νέα εικόνα και όχι σε αυτή που τραβάς τα δεδομένα. Όπως το κάνεις τώρα θα επηρεαστούν οι τιμές των άλλων pixel.

 

Όσο για τις τιμές που βγαίνουν float είναι απόλυτα λογικό. Όταν κάνεις στρογγυλοποίηση δεν αλλάζει το είδος της μεταβλητής. Για να γίνει αυτό πρέπει να κάνεις casting.

 

> x = (int)y;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στην τελευταία γραμμή που αλλάζεις τα 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 που λες για να δημιουργηθεί η εικόνα ή είναι "προεραιτικό"?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά κάτσε να τα πάρουμε τα βήματα με την σειρά γιατί μάλλον το έχεις λίγο μπερδεμένο στο μυαλό σου.

 

Για να κάνεις αυτό που θέλεις χρειάζεσαι δύο εικόνες. Η μια θα είναι αυτή που θα διαβάζεις και άλλη μια ίδιων διαστάσεων που θα γράφεις. Δες το σαν πίνακες. Έστω οτι έχεις έναν πίνακα ονόματι Α και θέλεις να εφαρμόσεις την τεχνική του averaging. H διαδικασία που ακολουθείς είναι η παρακάτω:

  • Φτιάχνεις έναν νέο πίνακα (έστω Β) με ίδιες διαστάσεις με τον Α
  • Διαβάζοντας τις τιμές από τον πίνακα Α συμπληρώνεις τον πίνακα Β με τις τιμές που υπολογίζεις

Εφόσον εδώ μιλάμε για εικόνες, θα πρέπει να φτιάξεις μια δεύτερη εικόνα της οποία τα pixel θα χρωματίζεις ένα ένα. Το casting δεν είναι απαραίτητο ότι θα χρειαστεί. Μπορεί να το κάνει και αυτόματα η γλώσσα όταν θα περάσεις τα ορίσματα στην συνάρτηση. Αν δεις οτι έχεις πρόβλημα τότε κάν' το.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>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);

} 
} 

 

το αποτέλεσμα που παίρνω είναι οτι η εικονα δν μπορει να προβληθει επειδη περιεχει σφαλματα.:-/

πάλι λάθος κάνω σίγουρα αλλά ΠΟΥΥΥΥΥΥ??? <_< :confused:

 

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);

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

χωρίς να έχω δει τα docs να κάνω μια παρατήρηση που μπορεί να είναι λάθος, αλλά δε μου κάθετε καλά όπως το έχεις.

 

1ον το imagepng δε θα έπρεπε να είναι έξω από τα loops; Θεωρητικά αυτή μοιάζει με την μέθοδο που θα πάρει ένα matrix και θα τον κάνει εικόνα

2ον δίνεις κάποιες τιμές στο $handle αλλά δε το χρησιμοποιείς. Μήπως πρέπει αυτό να είναι η παραμετρός σου στη function imagepng?

 

 

EDIT

οκ με πρόλαβες και τα διόρθωσες

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

σωστά αυτά που είπες:) τα πρόσεξα και τ άλλαξα..πανω απο τα 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);

 

νιώθω πως είμαστε κοντά αλλά..:-/

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

εγώ τρέχω το κώδικά σού και δε μου εμφανίζει κάποιο λάθος αλλά μια μαύρη εικόνα 32x32 ... <_<

 

:o μα πως? σε τι 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

post-204822-0-99689600-1337345597_thumb.png

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το 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));

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...