Важная информация

User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 27

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

  1. #11
    Veteran Аватар для SMT
    Регистрация
    16.01.2005
    Адрес
    Бобруйск
    Сообщений
    1,267
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Учитывать 3-ки и четверки это уже нелинейная интерполяция и потребует арифметику с плавающей точкой или в крайнем случае умножение/деление точно
    для ч/б - умножение по таблицам

  2. #12
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

  3. #13
    Member
    Регистрация
    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;
      }
    }
    Само-собой код можно оптимизировать. Это я написал для понятности.

  4. #14
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

  5. #15
    Member
    Регистрация
    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.

  6. #16
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

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

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

  8. #17
    Member
    Регистрация
    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.

  9. #18
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Замечательно, вроде всё получается, благодаря советам с форума. Ещё раз спасибо всем откликнувшимся. Отпуск короткий и пока я делаю другие вещи мне всё же хотелось бы не тратить время на решение этой задачи, а увидеть в этой ветке уже готовую формулу как перевести цвет в формате RGB в формат INDEXED COLOR, т.е. в стандартную палитру Палма.
    С уважением, Станислав.

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

    По умолчанию

    Если RGB результрующей картинки, где могут быть смешанные цвета (не спектрумовские) для сглаживания результатов масштабирования, то где-то так:

    Код:
    index = (green / 0x33) + ((red / 0x33) * 18) + ((blue / 0x33) % 3) * 6
    if (blue < 0x80) {
      index = index + 108
    }
    Я только вот думаю, что не лучше ли перестроить палитру под себя, чтобы она не была такой неудобной? (нет четкого разделения по битам). Тогда бы можно было отказаться от умножения/деления и обойтись лишь одними сдвигами. (Не знаю правда, насколько быстро моторола умножает и делит )

    Например, выделить под цвет 2 бита и получим 64 цвета, но этого хватит на самом деле.

    Т.е. скажем индекс в палитре будет раскладываться по битам так: 00RRGGBB

  11. #20
    Activist Аватар для captain cobalt
    Регистрация
    13.03.2005
    Адрес
    Пермь
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С точки зрения объёма данных лучше преобразовывать из экрана 6912 в конечный результат. Т. е. (2 байта экрана + 1 байт аттрибутов) -> 4 пикселя. Возможно, байт аттрибутов сначала преобразовать и затем применять ко всем 4 строкам.

    Имеются ли 32-битные регистры? Целочисленное умножение? Какова палитра?
    [Добавлено]
    Ответы нашлись здесь и здесь.
    Последний раз редактировалось captain cobalt; 27.07.2006 в 21:30. Причина: Добавлено

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

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

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

Эту тему просматривают: 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

Ваши права

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