За последние 24 часа нас посетили 58928 программистов и 1816 роботов. Сейчас ищут 1119 программистов ...

Проблема с картинкой

Тема в разделе "PHP для новичков", создана пользователем vik787878, 31 окт 2017.

  1. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    Доброго дня. Пытаюсь загнать картинку в двухмерный массив а потом вывести ее на экран.
    Но выводится она с большими искажениями.
    Как я понимаю проблему создает вот этот кусок кода.

    Код (Text):
    1. if(imagecolorstotal($f) > 255)
    2.             $color2 = imageColorClosest($f, $R, $G, $B);
    3.         else
    4.             $color2 = imageColorAllocate($f, $R, $G, $B);
    Но как обойти это ограничение я не понимаю. Может кто нибудь поделится мыслями.


    Код (Text):
    1. <?php
    2. class tochka{
    3.     var $x;
    4.     var $y;
    5.     var $color1;
    6.     Function Show(&$f) //f  это ссыка на холст
    7.     {
    8.         $R = ($this->color1 >> 0xF) & 0xFF;
    9.         $G = ($this->color1 >> 0x8) & 0xFF;
    10.         $B = $this->color1  & 0xFF;
    11.         if(imagecolorstotal($f) > 255)
    12.             $color2 = imageColorClosest($f, $R, $G, $B);
    13.         else
    14.             $color2 = imageColorAllocate($f, $R, $G, $B);
    15.        
    16.         // вывод точки на экран
    17.         imagesetpixel($f,$this->x,$this->y, $color2);
    18.     }
    19.     function __construct($x, $y, $col)
    20.     {
    21.         $this->x=$x;
    22.         $this->y=$y;
    23.         $this->color1=$col;
    24.     }  
    25. }
    26. $filename="rrr2.jpg"; // картинка
    27. $size = getimagesize($filename);
    28. $w1=$size[0]; //Ширина картинки
    29. $h1=$size[1]; //Высота картинки
    30. $image = imageCreateFromJpeg($filename);
    31. $MayArray = Array();
    32. for($i=0; $i<$h1; $i++)
    33. {
    34.     for($j=0; $j<$w1; $j++)
    35.     {
    36.         $color1 = imagecolorat($image,$j, $i);// получает цвет пикселя
    37.         //$color1 = imageColorAllocate($image, 0, 0, 0);
    38.         $MayArray[$i][$j]= new tochka($j,$i, $color1);
    39.     }
    40. }
    41. imageDestroy($image);
    42. //$color = imagecolorat($image, 300, 310);// получает цвет пикселя
    43.  
    44. $ie = imageCreate($w1+50,$h1+50);
    45. imageColorAllocate($ie, 250,250,250);
    46.  
    47. for($i=0; $i<$h1; $i++)
    48. {
    49.     for($j=0; $j<$w1; $j++)
    50.     {
    51.         $MayArray[$i][$j]->Show($ie);
    52.         //imagesetpixel($ie,$j,$i, $MayArray[$i][$j]);
    53.     }
    54. }  
    55. Header ("Content-type: image/jpeg");
    56. imageJpeg($ie);
    57. imageDestroy($ie);
    58. ?>
     
  2. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Картинку создавали через imagecreatetruecolor?
     
    vik787878 нравится это.
  3. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    Спасибо за подсказку. сработало.
     
  4. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Спасибо не плескается) Кнопка есть.
     
  5. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    А кстати почему картинка выводится столь медленно? картинки 800х600 вообще нужно ждать минут 15 пока сформируются
     
  6. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Хостер, провайдер, кэш, ...
     
  7. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    Все пока на моем компьютере

    Код (Text):
    1. <?php
    2. ini_set('max_execution_time', 1900);
    3. class tochka{
    4.     var $x;
    5.     var $y;
    6.     var $color1;
    7.     Function Show(&$f) //f  это ссыка на холст
    8.     {
    9.         $R = ($this->color1 >> 0xF) & 0xFF;
    10.         $G = ($this->color1 >> 0x8) & 0xFF;
    11.         $B = $this->color1  & 0xFF;
    12.         if(imagecolorstotal($f) >= 255)
    13.             $color2 = imageColorClosest($f, $R, $G, $B);
    14.         else
    15.             $color2 = imageColorAllocate($f, $R, $G, $B);
    16.        
    17.         // вывод точки на экран
    18.         //imagesetpixel($f,$this->x,$this->y, $color2);
    19.         imagesetpixel($f,$this->x,$this->y, $this->color1);
    20.     }
    21.     function __construct($x, $y, $col)
    22.     {
    23.         $this->x=$x;
    24.         $this->y=$y;
    25.         $this->color1=$col;
    26.     }  
    27. }
    28. class Smeh{
    29.     var $nY;
    30.     var $kY;
    31.     var $shag;
    32.     function __construct($x, $y, $z, $f)//z - колличество вертикальных полос
    33.     {
    34.         $this->nY=$x;
    35.         $this->kY=$y;
    36.         if ($f)
    37.             $this->shag= abs($x-$y)/$z;
    38.         else $this->shag= (abs($x-$y)/$z)*(-1);
    39.     }  
    40. }
    41.  
    42. function ChetNechet($x){//превращает число в четное. только для целых чисел
    43.     if( $x & 1) {
    44.         return $x-1;
    45.     }
    46.     else
    47.         return $x;
    48. }
    49.  
    50. function RaschetY($mX, $mY){// матрица с лево
    51. $mX=ChetNechet($mX);
    52. $mY=ChetNechet($mY);
    53. $M = array();
    54. $nY=0;
    55. $kY = $mY/2 ;
    56. $perehod=0;
    57. for ($y=0; $y<$mY; $y++){
    58.     for ($x=0; $x<$mX; $x++){
    59.         $M[$x][$y]=new Smeh($nY, $kY, $mX, true);
    60.     }
    61.     $nY +=2;
    62.     $kY++;
    63.     $perehod=$y;
    64.     if ($nY>=$mY)
    65.         break;
    66. }
    67. //echo "это:".$y."<br>";
    68. $perehod++;
    69. for ($y=$perehod; $y<=$mY; $y++){
    70.     for ($x=0; $x<$mX; $x++){
    71.         $M[$x][$y]= new Smeh($nY, $kY, $mX, false);
    72.     }
    73.     $nY +=2;
    74.     $kY++;
    75.     //if ($nY>$mY*2)
    76.         //break;
    77. }
    78.  
    79.  
    80. $M3 = array();
    81. for ($y=0; $y<=$mY; $y++){
    82.     $p=$M[0][$y]->nY;
    83.     for ($x=0; $x<$mX; $x++){
    84.         $M3[$x][$y] = $p;
    85.         $p+=$M[$x][$y]->shag;      
    86.     }  
    87. }
    88. return $M3;
    89. }
    90.  
    91. function RaschetYO($mX, $mY){// матрица с право
    92. $mX=ChetNechet($mX);
    93. $mY=ChetNechet($mY);
    94. $M = array();
    95. $nY=$mY/2;
    96. $kY=0;
    97. for ($y=0;$y<$mY/2; $y++){
    98.     for($x=0; $x<$mX;$x++){
    99.         $M[$x][$y]=new Smeh($nY, $kY, $mX, false);
    100.     }
    101.     $nY++;
    102.     $kY+=2;  
    103. }
    104. for ($y=$mY/2;$y<=$mY; $y++){
    105.     for($x=0; $x<$mX;$x++){
    106.         $M[$x][$y]=new Smeh($nY, $kY, $mX, true);
    107.     }
    108.     $nY++;
    109.     $kY+=2;  
    110. }
    111. $M3 = array();
    112. for ($y=0; $y<=$mY; $y++){
    113.     $p=$M[0][$y]->nY;
    114.     for ($x=0; $x<$mX; $x++){
    115.         $M3[$x][$y] = $p;
    116.         $p+=$M[$x][$y]->shag;      
    117.     }
    118. }
    119. return $M3;
    120. }
    121.  
    122. $filename="Koala.jpg";
    123. $size = getimagesize($filename);
    124. $w1=$size[0]; //Ширина картинки
    125. $h1=$size[1]; //Высота картинки
    126. $image = imageCreateFromJpeg($filename);
    127.  
    128. $M1=array();
    129. $M2=array();
    130. $M2=RaschetYO($w1,$h1);
    131. $M4=array();
    132. $M4=RaschetY($w1,$h1);
    133.  
    134.  
    135.  
    136. for($y=0; $y<$h1; $y++){
    137.     for($x=0; $x<$w1; $x++){
    138.         $color=imagecolorat($image,$x,$y);
    139.         $M[$x][$y]= new tochka($x, $M2[$x][$y], $color);
    140.         $M[$x+$w1][$y]= new tochka($x+$w1, $M4[$x][$y], $color);
    141.     }
    142. }
    143. imageDestroy($image);
    144. $ie = imagecreatetruecolor($w1*2,$h1*2);
    145. $col2=imagecolorallocate($ie,255,255,255); // создаем белый цвет
    146. ImageFill($ie,1,1,$col2);
    147.  
    148.  
    149. for($y=0; $y<$h1; $y++){
    150.     for($x=0; $x<$w1*2; $x++){
    151.         $M[$x][$y]->show($ie);
    152.     }
    153. }
    154.  
    155. Header ("Content-type: image/jpeg");
    156. imageJpeg($ie);
    157. imageDestroy($ie);
    158.  
    159. ?>
     
  8. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    800 x 600 говоришь? Бедненький компьютер. За что его так? Только в этом месте создается 480.000 экземпляров смеха)
    --- Добавлено ---
    Классы - это круто. Только не всегда они уместны.
     
  9. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    получается что классы это медленно?
     
  10. Griffter

    Griffter Новичок

    С нами с:
    27 сен 2017
    Сообщения:
    92
    Симпатии:
    25
    Нет, классы - это нормально, если их правильно использовать. В вашем же случае это нерационально и трудоемко...
     
  11. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    а в php есть что то типо структур?
    например в с# можно создать

    Код (Text):
    1. struct Point
    2. {
    3.   int x;
    4.   int y;
    5. }
    потом вызывать
    Код (Text):
    1. Point.x;
    2. Point.y;
    Соответственно в массиве переменная Point в кoторой 2 значения x и y.
     
  12. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    PHP:
    1. $pt = array('x' => 100, 'y' => 100);
    2. echo $pt['x'] . ' ' . $pt['y'];
    PHP:
    1. $pts = array();
    2. for($y = 0; $y < 1000; $y++)
    3.   for($x = 0; $x < 1000; $x++) {
    4.     $pts[] = array('x' => $x, 'y' => $y);
    5.   }
    6. foreach($pts as $pt) {
    7.   echo $pt['x'] . ' ' . $pt['y'] . "\n";
    8. }
     
    vik787878 нравится это.
  13. vik787878

    vik787878 Новичок

    С нами с:
    23 окт 2017
    Сообщения:
    12
    Симпатии:
    0
    спасибо. Написал тоже самое но без классов и функций. Парадокс, но теперь грузит даже большие файлы за 5-10сек