User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 27

Тема: Масштабирование экрана Спектрума

Комбинированный просмотр

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

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В общем, то ли я не до конца донёс суть, то ли меня просто не правильно поняли. Надо видимо пояснить для чего это вообще нужно. Нужно вывести на экран Палма имеющего разрешение 160х160 экран Спектрума. В идеале нужно это делать 50 раз в секунду, поэтому предложенные варианты не подходят совершенно. Нужно что-то простое, короткое и быстрое. Самый простой вариант, который тут же приходит в голову это табличка на 8 килобайт: 1 бит яркости + 4 точки*3 бита = 13 бит = 8192 байта. Но таблица в 8 килобай не приемлема!

    Например, я вывожу картинку в 16 градаций серого просто суммируя яркости 4-х точек и поделив сумму на 4. Результат смотрите в прилагаемой (средней) картинке.

    Для цветной картинки такой вариант безусловно не годится, но ради спортивного интереса я реализовал его. Результат неудовлетворитлен. (См. третью картинку)

    Первая картинка просто для иллюстрации. Это вывод монохромной картинки уменьшенной вдвое в 4 градации яркости.

    То, что я спрашиваю - это простая математическая задача. Попробую сформулировать её более подробно. Дано 4 числа от 0 до 15, с ними нужно произвести какие-то действия, чтобы получить число от 0 до 255. Это число на выходе должно чётко давать понять какие числа и сколько были на входе. Дополнительные условия:
    1. Из четырёх чисел разных может быть только 2.
    2. В четвёрке чисел одновременно могут находится только числа либо от 0 до 7, либо от 8 до 15.
    3. Последовательность чисел в чётвёрке не имеет значание, то есть с точки зрения аглоритма последовательности 0111, 1011, 1101 и 1110 должны быть равны.

    Вот почему я приводил эти "неинтерсные технические подробности". Все пункты, которые я привёл с моей точки зрения как раз играют важное значение в реализации алгоритма.

    Так более понятно?
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Dizzy2bpp.png 
Просмотров:	1497 
Размер:	3.2 Кб 
ID:	3497   Нажмите на изображение для увеличения. 

Название:	Dizzy4bpp.png 
Просмотров:	1498 
Размер:	4.3 Кб 
ID:	3498   Нажмите на изображение для увеличения. 

Название:	Dizzy8bpp.png 
Просмотров:	465 
Размер:	5.8 Кб 
ID:	3499  
    С уважением, Станислав.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    key-jee предложил интересный и простой метод. Завтра попробую проверить его на практике. Пока просто не могу поверить что всё так просто и что, самое главное, это метод будет работать. Но вопрос не снимается, вдруг у кого-то есть ещё мысли.
    С уважением, Станислав.

  4. #3

    Регистрация
    02.02.2006
    Адрес
    Voronezh
    Сообщений
    94
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Для цветной линейная интерполяция годится, но интерполировать нужно каждый канал отдельно, R, G, B и переводить результат в палитру 256 цветов

    Короче ради интереса потестил. По-моему нормально.

    Результат (с дополнительным приведением к 2бита на канал цвета)
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	test.png 
Просмотров:	444 
Размер:	7.1 Кб 
ID:	3502   Нажмите на изображение для увеличения. 

Название:	result.png 
Просмотров:	419 
Размер:	3.8 Кб 
ID:	3503  
    Последний раз редактировалось maximk; 26.07.2006 в 17:51.

  5. #4

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от maximk
    Короче ради интереса потестил. По-моему нормально.
    Результат (с дополнительным приведением к 2бита на канал цвета)
    Результат впролне удовлетворяет! Прошу разложить мне по полочкам суть метода.

    Цитата Сообщение от SMT
    учитывая лишь 2x2 мы получим "рывки" на фреймовых эффектах.
    На Палме, под который пишется эмулятор, ни о каких фреймовых эффектах речь не идёт вообще - процессор слишком слаб и эмуляция упрощена до невозможности.

    Цитата Сообщение от SMT
    больше всего меня интересует, как ты выбираешь палитру для цветного режима?
    Никак не выбираю. Пользуюсь той, что предлагается по умолчанию. А из неё выбираю наиболее похожие цвета. Я не стремлюсь к максимальной точности.
    С уважением, Станислав.

  6. #5

    Регистрация
    02.02.2006
    Адрес
    Voronezh
    Сообщений
    94
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Исходные данные. Двумерный массив точек изображения, которое надо
    масштабировать - image[][]. Элемент массив - число, определяющее цвет точки (в каком либо виде).

    Есть вспомогательные функции(макросы), которыми можно извлечь
    каждую компоненту из этого числа - getRed/getGreen/getBlue

    Идем по точкам результирующего изображения:

    Код:
    for (int x=0; x<128; ++x) {
      for (int y=0; y<96; ++y) {
        // интерполируем каждый канал по отдельности
        int red = (getRed(image[x*2][y*2]) +
                        getRed(image[x*2+1][y*2]) +
                        getRed(image[x*2][y*2+1]) +
                        getRed(image[x*2+1][y*2+1])) / 4;
    
        int green = (getGreen(image[x*2][y*2]) +
                        getGreen(image[x*2+1][y*2]) +
                        getGreen(image[x*2][y*2+1]) +
                        getGreen(image[x*2+1][y*2+1])) / 4;
    
        int blue = (getBlue(image[x*2][y*2]) +
                        getBlue(image[x*2+1][y*2]) +
                        getBlue(image[x*2][y*2+1]) +
                        getRed(image[x*2+1][y*2+1])) / 4;
    
        // имеет цвет точки в виде R,G,B
        int paletteIndex = convertToPalette(red, green, blue);
        newImage[x][y] = paletteIndex;
      }
    }
    Само-собой код можно оптимизировать. Это я написал для понятности.

  7. #6

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Есть ещё вопрос в рамках той же темы. В прилагаемом файле стандартная палитра Палма. Один цвет занимает клетку 8x8. Цвета идут слева направо, сверху вниз. Цвет в левой верхней клетке имеет номер 0 и далее по возрастанию.

    Никогда до этого не сталкивался, поэтому для меня несколько не ясно как получаются эти цвета... Не могу понять закономернось. Какой бит номера цвета за что отвечает?
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Palm_palette.png 
Просмотров:	307 
Размер:	1.3 Кб 
ID:	3506  
    С уважением, Станислав.

  8. #7

    Регистрация
    02.02.2006
    Адрес
    Voronezh
    Сообщений
    94
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну, там используются так называемые web-safe цвета.

    Каждая компонента может принимать значение из набора 0x00, 0x33, 0x66, 0x99, 0xCC, and 0xFF и того имеем 6^3=216 цветов + дополнительные оттенки для серого (все компоненты 0x22, 0x44, 0x55, 0x77, 0x88, 0xAA, 0xBB, 0xDD, 0xEE) и если посмотреть на представленную палитру еще несколько цветов, где компонента либо 0x88 либо 0x00

    Значит если мы возьмем номер в палитре от 0 до 215, то можно его разложить таким образом:
    index % 6 = индекс зеленого в массиве [0xFF, 0xCC, 0x99, 0x66, 0x33, 0x00]
    (index / 18) % 6 = индекс красного в массиве
    (((index / 6) % 3) * 2) + (index / 108) * 3 = индекс синего. Т.е. смысл в том, что первую часть палитры синий убывает по горизонтали в группах с 0xff до 0x99, а вторую половину с 0x66 до 0x00

    Цвет с номером 215 не черный, а темно-темно серый (0x111111)

    Если я не ошибся конечно...

    Это я написал преобразование номера в RGB, но думаю и обратная операция большого труда не составит. Можно сделать таблицу(ы) для ускорения. По 512 байт получится.

    А вообще, неужели в API PalmOS нет таких функций, для работы с цветом покомпонентно? Прямо даже не верится...
    Последний раз редактировалось maximk; 27.07.2006 в 10:46.

  9. #8

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за помощь!

    Цитата Сообщение от maximk
    Ну, там используются так называемые web-safe цвета.
    ...
    Цвет с номером 215 не черный, а темно-темно серый (0x111111)
    Если я не ошибся конечно...
    Нет, не ошибся, всё верно. Это я уже опытным путём проверил

    Только напомни, пожалуйста, какое действие обозначает знак процента (%). Целочисленное деление?

    Цитата Сообщение от maximk
    А вообще, неужели в API PalmOS нет таких функций, для работы с цветом покомпонентно? Прямо даже не верится...
    Наверняка есть! Но всё, что я пишу, я пишу на чистом ассемблере. Можно конечно и из ассемблера все эти API вызывать, но разбираться совсем нет желания, да и нет времени у программы пользоваться громоздкими и медленными процедурами API.
    С уважением, Станислав.

  10. #9

    Регистрация
    02.02.2006
    Адрес
    Voronezh
    Сообщений
    94
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    % - остаток от деления. Т.е. например 5 % 3 = 2 (частное = 1, в случае целочисленного деления)
    Последний раз редактировалось maximk; 27.07.2006 в 11:19.

  11. #10

    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    5,213
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    706
    Спасибо Благодарностей получено 
    1,641
    Поблагодарили
    572 сообщений
    Mentioned
    50 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от maximk
    (((index / 6) % 3) * 2) + (index / 108) * 3 = индекс синего.
    Для красного и зелёного формулы работают, а для синего нет Логически прикинув понял, что в формуле лишнее умножение на 2. То есть формула должна выглядеть так:

    ((index / 6) % 3) + (index / 108) * 3 = индекс синего

    При этом ты ещё забыл упомянуть, что везде идёт деление без остатка.
    С уважением, Станислав.

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Обрезание спрайта на краю экрана.
    от moroz1999 в разделе Программирование
    Ответов: 29
    Последнее: 18.02.2009, 16:20
  2. Firmware для Спектрума
    от CityAceE в разделе Оси
    Ответов: 30
    Последнее: 25.07.2005, 10:14
  3. Удовольствие от Спектрума?
    от Virtex в разделе Несортированное железо
    Ответов: 3
    Последнее: 09.04.2005, 23:32
  4. Разрешение экрана.
    от CityAceE в разделе Форум
    Ответов: 19
    Последнее: 06.03.2005, 06:37

Ваши права

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