@Vlad_Ilnitskiy

Как провести конвертацию изображения в текстовый формат?

Необходимо написать программу, которая на входе получает файл изображения типа BMP и конвертирует его в текстовый формат. В текстовом формате белый цвет отобразить пробелом, а черный - символом '8'. Как это можно реализовать? Сначала преобразовать в черно-белое, затем представить его в виде матрицы? Хотелось бы хоть маленькие куски кода увидеть, ибо плохо понимаю как это все будет выглядеть.
  • Вопрос задан
  • 5017 просмотров
Решения вопроса 2
@JastAir
Сама идея перевода изображения в монохром( а это я так понял тебе изначально надо ), это примерно так:
Пишу на c# Так как с ++ не очень знаком.
Color _pixelColor = img.GetPixel(x, y);
int _MonoNum = (_pixelColor.R + _pixelColor.G + _pixelColor.B)/3;
if (MonoNum<128) //if black color
{
matrix[x, y] = Convert.ToInt32("1"); 
}
else //white color
{
matrix[x, y] = Convert.ToInt32("0");
}

И не забывай что это все в циклах:
for (int x = 0; x < GlobalConst.width; x++)
for (int y = 0; y < GlobalConst.height; y++)


Примерно такая суть, а потом матрицу уже записываешь в файл, работы по сути на 15 минут. Советую еще посмотреть метод GetPixel на MSDN там про него все написано, а пользоваться тебе именно им нужно, если конечно не предстоит работать с большим разрешением.
Ответ написан
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Для начала обрати внимание, что BMP-изображения хранятся построчно снизу-вверх (но все-таки слева-направо). Там есть 4х байтное выравнивание. Какая битность у входящего изображения? Есть ли альфа-канал?

Удобнее всего работать с 4х-канальным изображением (RGBA), где на каждый канал - 1 байт. Таким образом выравнивание нас не заботит, можно читать вот такие структуры одна за одной:

struct BmpPixel
{
   unsigned char Blue;
   unsigned char Green;
   unsigned char Red;
   unsigned char Alpha;
};


В bmp-файле идет сначала заголовок файла, затем, заголовок изображения, потом буфер с данными. В первом узнаешь размер всего файла для чтения, во втором - характеристики изображения (как именно читать, сколько каналов, длинна строки и их количество). Это есть на MSDN.

Об остальном уже сказали. От себя могу посоветовать не преводить в грейкейл, а тупо складывать значение каналов (с альфой тоже можно подумать, например, умножить на три и вычесть из суммы каналов).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
avalak
@avalak
Судя по описанию, вам нужна библиотека для ascii графики.
aalib
написание html5 генератора ascii art
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Все довольно просто. Берем картинку, перегоняем ее в grayscale, разбиваем ее на сетку (скажем 10*10 пикселей), вычисляем среднее значение яркости для этого куска и определяем, если яркость выше порогового значения (например 128) то это пробел, если же ниже или равно, то наш символ.
Ответ написан
ScorpLeX
@ScorpLeX
Это вы часть текста заказа скопировали?
Фактически изображение это и есть матрица пикселей.
Перевести в черно-белое можно определяя цвет пикселя, если больше 8000000 (не точно) значит белый, если меньше то черный.
Проходим по матрице определяя цвет и записывая попутно, вот и все.
Гуглить по фразе ascii art generator
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы