Доброго дня. Пытаюсь загнать картинку в двухмерный массив а потом вывести ее на экран. Но выводится она с большими искажениями. Как я понимаю проблему создает вот этот кусок кода. Код (Text): if(imagecolorstotal($f) > 255) $color2 = imageColorClosest($f, $R, $G, $B); else $color2 = imageColorAllocate($f, $R, $G, $B); Но как обойти это ограничение я не понимаю. Может кто нибудь поделится мыслями. Код (Text): <?php class tochka{ var $x; var $y; var $color1; Function Show(&$f) //f это ссыка на холст { $R = ($this->color1 >> 0xF) & 0xFF; $G = ($this->color1 >> 0x8) & 0xFF; $B = $this->color1 & 0xFF; if(imagecolorstotal($f) > 255) $color2 = imageColorClosest($f, $R, $G, $B); else $color2 = imageColorAllocate($f, $R, $G, $B); // вывод точки на экран imagesetpixel($f,$this->x,$this->y, $color2); } function __construct($x, $y, $col) { $this->x=$x; $this->y=$y; $this->color1=$col; } } $filename="rrr2.jpg"; // картинка $size = getimagesize($filename); $w1=$size[0]; //Ширина картинки $h1=$size[1]; //Высота картинки $image = imageCreateFromJpeg($filename); $MayArray = Array(); for($i=0; $i<$h1; $i++) { for($j=0; $j<$w1; $j++) { $color1 = imagecolorat($image,$j, $i);// получает цвет пикселя //$color1 = imageColorAllocate($image, 0, 0, 0); $MayArray[$i][$j]= new tochka($j,$i, $color1); } } imageDestroy($image); //$color = imagecolorat($image, 300, 310);// получает цвет пикселя $ie = imageCreate($w1+50,$h1+50); imageColorAllocate($ie, 250,250,250); for($i=0; $i<$h1; $i++) { for($j=0; $j<$w1; $j++) { $MayArray[$i][$j]->Show($ie); //imagesetpixel($ie,$j,$i, $MayArray[$i][$j]); } } Header ("Content-type: image/jpeg"); imageJpeg($ie); imageDestroy($ie); ?>
А кстати почему картинка выводится столь медленно? картинки 800х600 вообще нужно ждать минут 15 пока сформируются
Все пока на моем компьютере Код (Text): <?php ini_set('max_execution_time', 1900); class tochka{ var $x; var $y; var $color1; Function Show(&$f) //f это ссыка на холст { $R = ($this->color1 >> 0xF) & 0xFF; $G = ($this->color1 >> 0x8) & 0xFF; $B = $this->color1 & 0xFF; if(imagecolorstotal($f) >= 255) $color2 = imageColorClosest($f, $R, $G, $B); else $color2 = imageColorAllocate($f, $R, $G, $B); // вывод точки на экран //imagesetpixel($f,$this->x,$this->y, $color2); imagesetpixel($f,$this->x,$this->y, $this->color1); } function __construct($x, $y, $col) { $this->x=$x; $this->y=$y; $this->color1=$col; } } class Smeh{ var $nY; var $kY; var $shag; function __construct($x, $y, $z, $f)//z - колличество вертикальных полос { $this->nY=$x; $this->kY=$y; if ($f) $this->shag= abs($x-$y)/$z; else $this->shag= (abs($x-$y)/$z)*(-1); } } function ChetNechet($x){//превращает число в четное. только для целых чисел if( $x & 1) { return $x-1; } else return $x; } function RaschetY($mX, $mY){// матрица с лево $mX=ChetNechet($mX); $mY=ChetNechet($mY); $M = array(); $nY=0; $kY = $mY/2 ; $perehod=0; for ($y=0; $y<$mY; $y++){ for ($x=0; $x<$mX; $x++){ $M[$x][$y]=new Smeh($nY, $kY, $mX, true); } $nY +=2; $kY++; $perehod=$y; if ($nY>=$mY) break; } //echo "это:".$y."<br>"; $perehod++; for ($y=$perehod; $y<=$mY; $y++){ for ($x=0; $x<$mX; $x++){ $M[$x][$y]= new Smeh($nY, $kY, $mX, false); } $nY +=2; $kY++; //if ($nY>$mY*2) //break; } $M3 = array(); for ($y=0; $y<=$mY; $y++){ $p=$M[0][$y]->nY; for ($x=0; $x<$mX; $x++){ $M3[$x][$y] = $p; $p+=$M[$x][$y]->shag; } } return $M3; } function RaschetYO($mX, $mY){// матрица с право $mX=ChetNechet($mX); $mY=ChetNechet($mY); $M = array(); $nY=$mY/2; $kY=0; for ($y=0;$y<$mY/2; $y++){ for($x=0; $x<$mX;$x++){ $M[$x][$y]=new Smeh($nY, $kY, $mX, false); } $nY++; $kY+=2; } for ($y=$mY/2;$y<=$mY; $y++){ for($x=0; $x<$mX;$x++){ $M[$x][$y]=new Smeh($nY, $kY, $mX, true); } $nY++; $kY+=2; } $M3 = array(); for ($y=0; $y<=$mY; $y++){ $p=$M[0][$y]->nY; for ($x=0; $x<$mX; $x++){ $M3[$x][$y] = $p; $p+=$M[$x][$y]->shag; } } return $M3; } $filename="Koala.jpg"; $size = getimagesize($filename); $w1=$size[0]; //Ширина картинки $h1=$size[1]; //Высота картинки $image = imageCreateFromJpeg($filename); $M1=array(); $M2=array(); $M2=RaschetYO($w1,$h1); $M4=array(); $M4=RaschetY($w1,$h1); for($y=0; $y<$h1; $y++){ for($x=0; $x<$w1; $x++){ $color=imagecolorat($image,$x,$y); $M[$x][$y]= new tochka($x, $M2[$x][$y], $color); $M[$x+$w1][$y]= new tochka($x+$w1, $M4[$x][$y], $color); } } imageDestroy($image); $ie = imagecreatetruecolor($w1*2,$h1*2); $col2=imagecolorallocate($ie,255,255,255); // создаем белый цвет ImageFill($ie,1,1,$col2); for($y=0; $y<$h1; $y++){ for($x=0; $x<$w1*2; $x++){ $M[$x][$y]->show($ie); } } Header ("Content-type: image/jpeg"); imageJpeg($ie); imageDestroy($ie); ?>
800 x 600 говоришь? Бедненький компьютер. За что его так? Только в этом месте создается 480.000 экземпляров смеха) --- Добавлено --- Классы - это круто. Только не всегда они уместны.
Нет, классы - это нормально, если их правильно использовать. В вашем же случае это нерационально и трудоемко...
а в php есть что то типо структур? например в с# можно создать Код (Text): struct Point { int x; int y; } потом вызывать Код (Text): Point.x; Point.y; Соответственно в массиве переменная Point в кoторой 2 значения x и y.
PHP: $pt = array('x' => 100, 'y' => 100); echo $pt['x'] . ' ' . $pt['y']; PHP: $pts = array(); for($y = 0; $y < 1000; $y++) for($x = 0; $x < 1000; $x++) { $pts[] = array('x' => $x, 'y' => $y); } foreach($pts as $pt) { echo $pt['x'] . ' ' . $pt['y'] . "\n"; }
спасибо. Написал тоже самое но без классов и функций. Парадокс, но теперь грузит даже большие файлы за 5-10сек