За последние 24 часа нас посетили 18203 программиста и 1685 роботов. Сейчас ищут 1111 программистов ...

Пикселизация изображения (эффект)

Тема в разделе "Решения, алгоритмы", создана пользователем Apple, 6 фев 2011.

  1. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Был нужен скрипт легкой пикселизации изображения как на табло для имитации надписи расписания маршрута.
    Что из этого вышло мне понравилось гораздо больше, чем я ожидал изначально. Поэтому выкладываю:


    PHP:
    1. <?
    2. /**
    3.  * @author Arthur Andersen [at] php.ru
    4.  * @version 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
    5.  */
    6.  
    7. // Коэффициент покрытия (размер будет увеличен на это число)
    8. define('EFX_COEFFICIENT', 3); // желательно не больше 3/4
    9.  
    10.  
    11. // png/jpg/gif или ещё чего. Мне это нужно для PNG
    12. $source = imagecreatefrompng("Dark_circles_(cropped).png");
    13.  
    14. // Source size
    15. $source_x = imagesx($source);
    16. $source_y = imagesy($source);
    17.  
    18. // Create zoomed image
    19. $target = imagecreatetruecolor($source_x*EFX_COEFFICIENT, $source_y*EFX_COEFFICIENT);
    20.  
    21. // Pixelate
    22. for($x = 1; $x < $source_x; $x++) {
    23.     for($y = 1; $y < $source_y; $y++) {
    24.         $color = imagecolorsforindex($source, imagecolorat($source, $x, $y));
    25.         $point = array(
    26.             'x' => ($x * EFX_COEFFICIENT),
    27.             'y' => ($y * EFX_COEFFICIENT),
    28.         );
    29.        
    30.         for($j = 0; $j < EFX_COEFFICIENT; $j++) {
    31.             imagesetpixel($target,
    32.                 $point['x'],
    33.                 $point['y'],
    34.                 imagecolorallocatealpha($target,
    35.                     $color['red'],
    36.                     $color['green'],
    37.                     $color['blue'],
    38.                     $color['alpha']
    39.                 )
    40.             );
    41.         }
    42.     }
    43. }
    44.  
    45. // png/jpg/gif
    46. header('Content-type: image/png');
    47. imagepng($target);
    48.  
    49. ?>
    Пара примеров:
    1. Оригинал изображения (фотография взята из википедии): http://savepic.ru/2290617.png
    2. После обработки (скрипт шустрый): http://savepic.ru/2262969.png

    Кому надо - пользуйтесь. Мне надо =)
     
  2. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Сам спросил, сам ответил :D

    Судя по картинке - просто тыкает несколько черных пикселей за каждым из картинки?
     
  3. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Нет. Иначе бы можно было опустить третий цикл, который, собственно, отвечает за эффект.
    Если его немного видоизменить, то он будет рисовать диагональные контуры либо разрозненную сетку.
     
  4. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Apple
    ну я имею ввиду, если не брать во внимание добавление промежуточных горизонтальных сплошных полос. Смысл то - просто раздвинуть пиксели между собой, на равномерное расстояние и залить черным фон?
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    У меня получилось попроще...
    Код (Text):
    1. for($x = 1; $x < $source_x; $x++) {
    2.     for($y = 1; $y < $source_y; $y++) {
    3.         imagesetpixel(
    4.             $target,
    5.             $x * EFX_COEFFICIENT,
    6.             $y * EFX_COEFFICIENT,
    7.             imagecolorat($source, $x, $y)
    8.         );
    9.     }
    10. }
    Разницы на среднестатистическом мониторе не заметил.
     
  6. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Apple
    Не знаешь, как сделать, чтобы на картинке всё свелось к двум цветам: всё, что тёмное, стало черным, всё, что светлое - белым?

    Не знаю даже, как это у могучего гугла спросить.
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?
    2.  
    3. /**
    4.  * @author Apple
    5.  */
    6.  
    7. $source = imagecreatefrompng('apple_av.png');
    8.  
    9. $source_x = imagesx($source);
    10. $source_y = imagesy($source);
    11.  
    12. $target = imagecreate($source_x, $source_y);
    13.  
    14. // Allocate white and black colors for future
    15. $black = imagecolorallocate($target, 0, 0, 0);
    16. $white = imagecolorallocate($target, 255, 255, 255);
    17.  
    18. // Trying to find edges
    19. for($x = 1; $x < $source_x; $x++) {
    20.     for($y = 1; $y < $source_y; $y++) {
    21.         $colorAt = imagecolorsforindex($source, imagecolorat($source, $x, $y));
    22.         $colorTo = max($colorAt['red'], $colorAt['green'], $colorAt['blue']);
    23.        
    24.         // If pixel's color is lower than 128 then it will be black
    25.         if($colorTo < 128) {
    26.             imagesetpixel($target, $x, $y, $black);
    27.         } else imagesetpixel($target, $x, $y, $white);
    28.     }
    29. }
    30.  
    31. header('Content-type: image/png');
    32. imagepng($target);
    33.  
    34. ?>
    1. Картинка http://savepic.ru/2281256.png
    2. После обработки http://savepic.ru/2285352.png

    Скрипт лично у меня жуть как тормозит. Смотри сам.
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Мне бы по душе больше такой вариант:

    PHP:
    1. <?
    2. /**
    3.  * @author Apple
    4.  * Create black and white image
    5.  */
    6. $source = imagecreatefrompng('apple_av.png');
    7.  
    8. $source_x = imagesx($source);
    9. $source_y = imagesy($source);
    10.  
    11. $target = imagecreatetruecolor($source_x, $source_y);
    12.  
    13. // Trying to find edges
    14. for($x = 0; $x < $source_x; $x++) {
    15.     for($y = 0; $y < $source_y; $y++) {
    16.         $colorAt = imagecolorsforindex($source, imagecolorat($source, $x, $y));
    17.         $colorTo = max($colorAt['red'], $colorAt['green'], $colorAt['blue']);
    18.        
    19.         // Wow =)
    20.         imagesetpixel($target, $x, $y, imagecolorallocatealpha(
    21.             $target, $colorTo, $colorTo, $colorTo, $colorAt['alpha']
    22.         ));
    23.     }
    24. }
    25.  
    26. imagesavealpha($target, true);
    27. header('Content-type: image/png');
    28. imagepng($target);
    29.  
    30. ?>
    Результат: [​IMG]

    Если поиграть с конечными байтами можно получить весьма интересный эффект:
    [​IMG]
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    пикселизация супер :cool:
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Не могу найти, но я как-то себе делал "Scale3×" вот это полезная штука... Если у кого есть тоже выкладывайте, а то я свой код похоже потерял ...
     
  11. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Apple
    Спасибо огромное, как раз то, что нужно
     
  12. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    HQ4x
    http://www.wiseandroid.com/image.axd?pi ... 2Fhq4x.png
    Весьма приятный алгоритм, только где б его на практике использовать =)