Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Замена определённых цветов картинки


Автор: Гость_Mihail 23.12.2005, 16:29
Есть метод, меняющий определённый цвет на другой заданный.

Вот он:
Код

    // Меняет цвет выводимых букв
    public void setFontColor(int AARRGGBB)
    {
    label_a:
        // Если устанавливаемый цвет соответствует текущему - выходим из процедуры.
        if (AARRGGBB == letterColor) break label_a; 
        int rgb_image_data[]; // хранение отдельных пикселов изображения шрифта;   
        // создаём массив пикселей, представляющий рисунок шрифта, для изменения цвета
        rgb_image_data = new int[imageFont.getWidth() * imageFont.getHeight()];
        imageFont.getRGB(rgb_image_data, 0, imageFont.getWidth(), 0, 0, imageFont.getWidth(), imageFont.getHeight());
        
// !!!!!!!!!!!  ВОТ С ЭТИМ ЦИКЛОМ ГЛЮК !!!!!!!!!!!!!!!!
        // Находим все пикселы со старым цветом шрифта, и заменяем новым цветом
        for (int i = 0; i < rgb_image_data.length; i ++)
        if (rgb_image_data[i] == letterColor){
            rgb_image_data[i] = AARRGGBB;     
        }
        
        letterColor = AARRGGBB; // Установка текущего цвета
        
        // Сохраняем изменения                
        imageFont = Image.createRGBImage(rgb_image_data, imageFont.getWidth(), imageFont.getHeight(), true);
    }



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

Пример глюкавого цвета:
0xFF008000;

Первые два байта (FF) - устанавливают прозрачность цвета(в данном случае абсолютно непрозрачен).
Вторые: красный канал (на мой взгляд не проблемный).
Третие (зелёный канал): первый байт не равен 0, второй = 0 - именно он вызывает глюк не только в эмуляторе, но и на телефоне(я так думаю).
Четвёртый - соответственно синий канал.


В чём проблема???

Автор: Гость_Mihail 23.12.2005, 18:52
Я ошибся - оно просто не может отобразить некоторые цвета.
Я выяснил почему, и у меня возник другой вопрос.
Телефон может отображать лишь 65536 цветов, т.е. два байта на
пиксел. У меня же идет 1 байт на прозрачность(можно не учитывать) и по по 3 байта цвета на пиксел, т.е. 16777216
цветов, что превышает цвета телефона. В результате этого телефон
принимает цвет ближайший заданному. Принатый цвет не совпадает с
заданным и мой метод начинает работать не так как надо.

Итак, новый вопрос:
Как узнать, какой цвет примет телефон вместо задаваемого, до
принятия цвета телефоном?

Автор: Guest 23.12.2005, 19:05
Я сам во всём разобрался - необходимая мне функция относиться к классу Graphics.
Нужен метод getDisplayColor(int). Правда он возвращает цвет без учёта степени прозрачности(не обрабатывает первый байт числа), но за этим дело не станет.

Ну вот и всё - тему можно закрывать.

Автор: Dancer 23.12.2005, 20:03
drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height, boolean processAlpha)
Renders a series of device-independent RGB+transparency values in a specified region

Автор: MMA 24.12.2005, 10:37
Это я - Guest и я же - Михаил.
Рисунок PNG занимает чуть меньше 4 килобайта, если хранить его массивом целых чисел, не разрастётся ли он до 25 килобайт? Хотя всё равно он это делает при смене цвета шрифта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)