User Tag List

Показано с 1 по 10 из 19

Тема: Конвертер изображений из PC в ZX-Spectrum

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #19

    Регистрация
    31.12.2017
    Адрес
    г. Реж
    Сообщений
    156
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Serdjuk Посмотреть сообщение
    Не подскажите где почитать за алгоритмы конвертации любой цветной картинки в 2-х цветную
    У себя делал так:

    Код:
                for (int y = 0; y < 192; y += 8)   //цикл по высоте(по знакоместам)
                for (int x = 0; x < 256; x += 8)   //цикл по ширине(по знакоместам)
                {
                	map<TColor,int> cmap;         // создаём map в которой ключ - цвет, значение - количество пикселей данного цвета в знакоместе
    
                	for (int yy = 0; yy < 8; yy++)//цикл по пикселям знакоместа
                	for (int xx = 0; xx < 8; xx++)
                    {
                            TColor c = ColorMod(Canvas->Pixels[x+xx][y+yy]); // модификация цвета пикселя в отдельной функции
                	        Canvas->Pixels[260+x+xx][y+yy] = c; // выведем преобразованную картинку рядом с оригиналом(цвета уже ZX, но не 2 цвета на знакоместа)
                    	cmap[c]++; // увеличим счётчик данного цвета в мапе
                    }
    
                    map<TColor,int>::iterator it;
    
                    TColor ink = TColor(0);// цвет INK пока что чёрный
                    int ci = 0; // переменная для сравнения количества пикселей разных цветов
                    
                    // найдём цвет, который в знакоместе встречается чаще всех, и сделаем INK
                    for (it = cmap.begin(); it != cmap.end(); it++) // пройдёмся по map с сохранёнными цветами
                    {
                    	if (it->second > ci) //если количество пикселей данного цвета больше чем предыдущее сохранённое количество
                            {
                        	        ci = it->second; //сохраним наибольшее количество
                                    ink = it->first; // сохраним сам цвет, который соответствует этому количеству
                            }
                    }
    
                    // удалим с мапы найденый цвет
                    cmap.erase(ink);
    
                    TColor paper = TColor(0);
                    int cp = 0;
    
                    // найдём второй цвет, который в знакоместе встречается чаще всех после INK, и сделаем его цветом PAPER
                    for (it = cmap.begin(); it != cmap.end(); it++)
                    {
                    	if (it->second > cp)
                            {
                        	        cp = it->second;
                                    paper = it->first;
                            }
                    }
    
                    // все остальные цвета, отличные от PAPER и INK, будем выводить либо тем, либо вторым цветом.
                    bool cur = false; // если истина - INK, если ложь - PAPER(так появится зернистость, чередование цвета INK и PAPER в тех местах, где цвета отличные от данных)
    
                    // опять пройдёмся по изображению
                    for (int yy = 0; yy < 8; yy++)
                	for (int xx = 0; xx < 8; xx++)
                    {
                            TColor c = Canvas->Pixels[260+x+xx][y+yy];
                            // далее чередование цветов
                            if (c != ink && c != paper)
                            {
                        	        if (cur) c = ink;
                                    else c = paper;
                                    cur = !cur;
                            }
    
                		Canvas->Pixels[260+x+xx][y+yy] = c;
                    }
    
                }
    И вспомогательные функции

    Код:
    // принимает компонент RGB цвета
    int Compr(int c)
    {
    	if (c < 96) return 0; // если меньше 96, то этот цвет ближе к чёрному
            if (c >= 224) return 255; // если больше 224, то цвет ближе к цвету повышенной яркости, чем к обычному
            return 192;// иначе цвет обычной яркости
    }
    
    // принимает RGB цвет
    TColor ColorMod(TColor c)
    {
            // выделим компоненты
    	int r = Compr(GetRValue(c));
            int g = Compr(GetGValue(c));
            int b = Compr(GetBValue(c));
    
            // тут два варианта преобразования
            int brig = (r!=192 && g!=192 && b!=192) ? 255 : 192; // повышенная яркость только тогда, когда все компоненты с повышенной яркостью(либо 0)
            //int brig = (r==255 || g==255 || b==255) ? 255 : 192; // если хотябы 1 компонент повышеной яркости, то всё знакоместо будем считать повышенной яркости, иначе всё знакоместо обычной яркости
            if (r != 0) r = brig;
            if (g != 0) g = brig;
            if (b != 0) b = brig;
    
            return (TColor)RGB(r, g, b);
    }

    Результаты(оригинал - вариант 1 - вариант 2):

    Нажмите на изображение для увеличения. 

Название:	конвертирование в ZX.jpg 
Просмотров:	183 
Размер:	62.2 Кб 
ID:	71531
    Последний раз редактировалось Dwa83; 16.02.2020 в 11:23.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Конвертер MP3 to AY
    от VETER в разделе Музыка
    Ответов: 13
    Последнее: 18.01.2015, 21:14
  2. Ответов: 7
    Последнее: 24.07.2013, 17:50
  3. ZX->VGA конвертер.
    от CHRV в разделе Изображение
    Ответов: 164
    Последнее: 28.06.2010, 11:26
  4. Ответов: 18
    Последнее: 18.06.2006, 16:50

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •