Создание ASCII-картинки из изображения на PHP
Создание ASCII-картинки из изображения на PHP
ASCII-картинки были очень популярны во времена первых компьютеров, когда экраны терминалов и печатающие устройства поддерживали только символы, без возможности рисовать полноценную графику. При создании такого изображения используется палитра, состоящая из буквенных, цифровых символов и символов знаков пунктуации. В зависимости от плотности точек, составляющих символ, а также их положения, визуально получает определенный оттенок серого цвета. Если рассматривать такую картину с расстояния, то символы складываются в полноценное черно-белое изображение.
У меня уже был самописный вариант генератора таких изображений где использовался широкий диапазон символов под каждый оттенок. И вот нашелся генератор с правильной математической моделью, который дает более лучший результат при использовании меньшего количества символов. За основу взят код от PerS'а, только свой вариант я постарался сделать без оверинженеринга. По-моему, нет смысла использовать классы там, где можно легко обойтись удобочитаемым линейным кодом.
Code (PHP) : Убрать нумерацию
- // Файл исходного изображения
- $file='image.jpg';
- $im=ImageCreateFromJPEG($file);
- list($width,$height)=GetImageSize($file);
- $luma_s=0;
- $luma=array();
- for ($x=0; $x<$width; $x++) {
- for ($y=0; $y<$height; $y++) {
- $RGB=ImageColorAt($im, $x, $y);
- $R=(($RGB >> 16) & 0xFF)*0.299;
- $G=(($RGB >> 8) & 0xFF)*0.587;
- $B=($RGB & 0xFF)*0.114;
- $tmp=$R+$G+$B;
- $luma_s+=$tmp;
- $luma[]=$tmp;
- }
- }
- $luma_m=$luma_s/$width/$height;
- $luma_q=0;
- foreach ($luma as $key=>$value) {
- $luma_q+=pow($value-$luma_m, 2);
- }
- $luma_q=sqrt($luma_q/$width/$height);
- $ascii='';
- for ($y=0; $y<($height-2); $y+=4) {
- for ($x=0; $x<($width-2); $x+=2) {
- $char=0;
- $char_m=0;
- for ($i=$y; $i<($y+2); $i++) {
- for ($j=$x; $j<($x+2); $j++) {
- $RGB=ImageColorAt($im, $j, $i);
- $R=(($RGB >> 16) & 0xFF)*0.299;
- $G=(($RGB >> 8) & 0xFF)*0.587;
- $B=($RGB & 0xFF)*0.114;
- $tmp=$R+$G+$B;
- if ($tmp<$luma_m) { $char++; }
- $char=($char<<1);
- $char_m+=$tmp;
- }
- }
- $char_m/=4;
- switch($char) {
- case 0b0000: {
- if ($char_m>=($luma_m+$luma_q) || $char_m>=255) {
- $ascii.=' ';
- }
- elseif ($char_m>=($luma_m+$luma_q/3)) {
- $ascii.='.';
- }
- elseif ($char_m>=$luma_m) {
- $ascii.='*';
- }
- else {
- $ascii.=' ';
- }
- break;
- }
- case 0b0001:
- case 0b0010: {
- $ascii.=',';
- break;
- }
- case 0b0011:
- case 0b0111: {
- $ascii.='/';
- break;
- }
- case 0b0101:
- case 0b1010: {
- $ascii.='=';
- break;
- }
- case 0b0110: {
- $ascii.='+';
- break;
- }
- case 0b1000:
- case 0b0100: {
- $ascii.='`';
- break;
- }
- case 0b1001: {
- $ascii.='"';
- break;
- }
- case 0b1011: {
- $ascii.='>';
- break;
- }
- case 0b1100:
- case 0b1110: {
- $ascii.='\\';
- break;
- }
- case 0b1101: {
- $ascii.='<';
- break;
- }
- default: {
- if ($char_m<=($luma_m-$luma_q) || $char_m<=0) {
- $ascii.='@';
- }
- elseif ($char_m<=($luma_m-$luma_q/3)) {
- $ascii.='O';
- }
- elseif ($char_m<=$luma_m) {
- $ascii.='o';
- }
- else {
- $ascii.='+';
- }
- break;
- }
- }
- }
- $ascii.="\n";
- }
- echo '<pre style="font-family:monospace; line-height:100%;">';
- echo $ascii;
- echo '</pre>';
Просмотров: 1796 | Комментариев: 10
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
токио
(27.01.2024 в 12:58):
Японский рогатый демон
demos
(16.03.2021 в 11:08):
- это-ж /*бубль-гум*/ Cаша Грей...
NobootRecord
(09.02.2021 в 17:14):
ManHunter, ну... в качестве результата может быть текстовый документ с картинкой
ManHunter
(08.02.2021 в 22:03):
Сделать можно что угодно, но вот целесообразность? На PHP оно вроде логично, картинку в форму загрузил, обработал, в браузере посмотрел, отмасштабировал и т.п. А на FASM конечный результат какой должен получиться?
NobootRecord
(08.02.2021 в 21:59):
Интересный генератор ASCII-картинок у вас получился, тем более на PHP.
А вы пробовали на других языках его реализовать? На FASM, например...
А вы пробовали на других языках его реализовать? На FASM, например...
ManHunter
(08.02.2021 в 21:37):
Нет, это не я. Когда я был в таком возрасте, то бумажное цветное фото было роскошью. Ну а про цифровое фото только в фантастических книжках читали.
doz.me
(08.02.2021 в 20:51):
а в разборе AVS Photo Editor фото не её.
даже есть такое мнение, что это детская фото mh)
даже есть такое мнение, что это детская фото mh)
кодер
(06.02.2021 в 02:25):
"нет смысла использовать классы там, где можно легко обойтись удобочитаемым линейным кодом."
жму руку, коллега. золотые слова.
жму руку, коллега. золотые слова.
ManHunter
(04.02.2021 в 21:17):
Ну а что, симпотная деваха, все натуральное, никаких партаков не набито. Мне нравится. Я обычно использую ее фотки в качестве демонстрашек всяких манипуляций с графикой.
doz.me
(04.02.2021 в 19:37):
ценителей ASCII-Art все меньше и меньше, имхо.
Сашка не в курсе, но походу она уже второй member of PCL)
Сашка не в курсе, но походу она уже второй member of PCL)
Добавить комментарий
Заполните форму для добавления комментария