forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=124)
-   -   Lib_alpha: Прозрачность картинок (http://forum.boolean.name/showthread.php?t=6058)

odd 28.06.2008 08:24

Lib_alpha: Прозрачность картинок
 
Я щас пишу библиотеку поддержки альфа-уровней для картинок.
Для тех кто не понял: по идее можно делать произвольную прозрачность для картинки, скажем 60%. Уже практически всё написано, запнулся только на одной ошибке.
Вот текст моей библиотеки на Java:

Код:

import javax.microedition.lcdui.Image;

class Lib_alpha
{
    Lib_alpha()
    {
    }

    public static int getalphalevels()
    {
        return FW.fw.display.numAlphaLevels();
    }
   
    public static Image setopaque(Image im, int op)
    {
        int mask = 0 | op << 64;
        int buff[] = new int[im.getWidth() * im.getHeight()];
        im.getRGB(buff, 0, im.getWidth(), 0, 0, im.getWidth(), im.getHeight());
        int i;
        for (i=0; i < buff.length; i++)
        {
            buff[i] = buff[i] | mask;  // <-- На эту строку и матерится эмулятор хотя NetBeans молчит
        }
        Image im2 = Image.createRGBImage(buff, im.getWidth(), im.getHeight(), true);
        return im2;
    }
}

Компилируется нормально, но при запуске эмулятор MidpX выдаёт что-то типа Error validating class и ругается причем именно на помеченную строку. В чём я не прав?

Текст проверочной программки на MP:

Код:

Program AlphaTest;
Uses        alpha;
Var        im: image;
Begin
        im:=LoadImage('/kcalc.png'); // Загрузка картинки
        DrawText('Уровней: '+GetAlphaLevels, 5, 5); // Отображаем количество альфа-уровней (256 по-идее)
        Repaint; Delay(1000); // Отрисовка и пауза 1 сек
        im:=SetOpaque(im, 127); // Выставляем прозрачность 127 из 255  т.е. 50%
        DrawImage(im, 0, 0); // Рисуем картинку
        Repaint; Delay(5000); // Снова отрисовка и пауза 5 сек
End.


ViNT 28.06.2008 22:36

Ответ: Lib_alpha: Прозрачность картинок
 
Не знаю, у меня на SE все работает без ошибок, правда картинка какая-то синюшная получается.

JIexa 30.06.2008 19:46

Ответ: Lib_alpha: Прозрачность картинок
 
odd, а можете этот код сделать в библиотеку? а то компилятора нет. А библиотека такая нужна. Пусть даже если не совсем доработанную.

ViNT 30.06.2008 20:21

Ответ: Lib_alpha: Прозрачность картинок
 
Да похоже она вообще не работает.
Картинка получается такая, как будто изменяется не alpha-канал, а канал синего.

JIexa 30.06.2008 21:56

Ответ: Lib_alpha: Прозрачность картинок
 
ViNT, ну выложи class файл. пожалуйста.

ViNT 30.06.2008 22:42

Ответ: Lib_alpha: Прозрачность картинок
 
Вложений: 1
Вот, но похоже она делает не то, что нужно.

odd 01.07.2008 08:30

Ответ: Lib_alpha: Прозрачность картинок
 
Что-то не так. У меня на SE K550i вобще не запускается. А в эмуляторе пишет, что ошибка валидации класса. Ещё мозгую над проблемой...

ViNT 01.07.2008 11:42

Ответ: Lib_alpha: Прозрачность картинок
 
А чем компилил?
Я иногда пытался компилить либы напрямую через javac (из wtk), так он мне тоже часто(но, что интересно, не всегда) писал ошибку верификации класса, хотя компиляция проходила нормально. Сейчас компилю через JB, все нормально, только изображение явно получается с измененным каналом синего, как будто не на тот байт маска накладывается.

JIexa 01.07.2008 14:53

Ответ: Lib_alpha: Прозрачность картинок
 
Код:

Program AlphaTest;
Uses alpha;
Var im: image;
i:integer;
Begin
im:=LoadImage('/123.png'); // Загрузка картинки
DrawText('Уровней: '+GetAlphaLevels, 5, 5); // Отображаем количество альфа-уровней (256 по-идее)
Repaint; Delay(1000);
setcolor(255,255,255);

for i:=1 to 255 do begin
fillrect(0,0,GetWidth,GetHeight);
im:=SetOpaque(im, i);
DrawImage(im, 0, 0);
Repaint; Delay(10);
End;

end.

А меня вот при таком коде картинка становится все синее и синее. Наоборот наверное не синий изменяется цвет а какой то другой уменьшается. А синий из-за этого выделяется. Хотя я не знаю :) буду ждать готовую библиотеку. Заранее спасибо

ViNT 01.07.2008 15:17

Ответ: Lib_alpha: Прозрачность картинок
 
Ну так, от 1 до 255 повышаем значение BB байта, получаем все более синюю картинку.

Piligrim 01.07.2008 18:51

Ответ: Lib_alpha: Прозрачность картинок
 
формат цветности aarrggbb, т.е. четыре байта. вы сдвигаете на 64 бита - это 8 байт, т.е. получается 2 раза по кругу.

odd 02.07.2008 03:11

Ответ: Lib_alpha: Прозрачность картинок
 
Вложений: 1
Я уже сделал по-другому. Ошибки валидации теперь нет.
Правда и прозрачности я тоже не увидел :(

Код:

import javax.microedition.lcdui.Image;

class Lib_alpha
{
    public static int mask;
   
    public static int getalphalevels()
    {
        return FW.fw.display.numAlphaLevels();
    }
   
    public static void setmask(int i)
    {
        switch (i)
        {
            case 0: {mask = 0x00000000; break;}
            case 1: {mask = 0x11000000; break;}
            case 2: {mask = 0x22000000; break;}
            case 3: {mask = 0x33000000; break;}
            case 4: {mask = 0x44000000; break;}
            case 5: {mask = 0x55000000; break;}
            case 6: {mask = 0x66000000; break;}
            case 7: {mask = 0x77000000; break;}
            case 8: {mask = 0x88000000; break;}
            case 9: {mask = 0x99000000; break;}
            case 10: {mask = 0xAA000000; break;}
            case 11: {mask = 0xBB000000; break;}
            case 12: {mask = 0xCC000000; break;}
            case 13: {mask = 0xDD000000; break;}
            case 14: {mask = 0xEE000000; break;}
            case 15: {mask = 0xFF000000; break;}
        }
    }
   
    public static Image opaquepicture(Image im)
    {
        int buff[] = new int[im.getWidth() * im.getHeight()];
        im.getRGB(buff, 0, im.getWidth(), 0, 0, im.getWidth(), im.getHeight());
        for(int i=0; i < buff.length; i++) buff[i] = buff[i] | mask;
        Image im2 = Image.createRGBImage(buff, im.getWidth(), im.getHeight(), true);
        return im2;
    }
}

Проверка проводилась так:

Код:

Program AlphaTest;
Uses        alpha;
Var        im: image;
                i: integer;
Begin
        im:=LoadImage('/kcalc.png');
        DrawText('Уровней: '+GetAlphaLevels, 5, 5);
        for i:=0 to 15 do
        begin
                SetColor(255,255,255); FillRect(0,0,200,200); SetColor(0,0,0);
                SetMask(i);
                DrawImage(OpaquePicture(im),5,5);
                DrawImage(OpaquePicture(im),25,25);
                DrawText(''+i,0,0);
                Repaint; Delay(1000);
        end
End.


Piligrim 02.07.2008 14:43

Ответ: Lib_alpha: Прозрачность картинок
 
Вложений: 1
Извиняюсь, что вмешиваюсь :( , но как-то у вас тут все затянулось.
Правда проверял только на Мотороле.

ViNT 02.07.2008 20:58

Ответ: Lib_alpha: Прозрачность картинок
 
Добавил все новые библиотеки в список.

odd 03.07.2008 07:56

Ответ: Lib_alpha: Прозрачность картинок
 
Гениально. Оказывается нужно было просто добавить маскировку and 0x00FFFFFF.
На SE пашет. Добавил библиотеку в коллекцию.
Спасибо, pilgrim!


Часовой пояс GMT +4, время: 07:05.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot