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!

odd 04.07.2008 08:34

Ответ: Lib_alpha: Прозрачность картинок
 
Вложений: 1
Добавил ещё функцию SetTransparentColor.
Скажем, у вас есть картинка im с белым фоном. Делаем:

SetTransparentColor(255, 255, 255);
im = SetOpaque(im, 255);


И получим ту же картинку, но уже с прозрачным фоном.
То же касается и полупрозрачных картинок.
Если раскинуть мозгами, можно теперь делать довольно интересные графические эффекты в играх.

GOODBYTE 04.07.2008 15:13

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

Не подскажешь, в чём ошибка?

Код:

program hello;

uses alpha;

var        load_image : image;
                        im_h, im_w, h, w, ph, pw, i : integer;

begin
       
        load_image := loadImage('/media.png');
       
        h  := getHeight;
        w := getWidth;
        im_w := getImageWidth(load_image);
        im_h := getImageHeight(load_image);
       
        (* вычиселение новых координат :) *)
       
        ph := h / 2;
        pw := (w / 2) - (im_w / 2);
       
        for i := 1 to alpha.GetAlphaLevels do

                begin
                       
                        setColor(0, 0, 0);
                        FillRect(0, 0, w, h);
                                               
                        alpha.SetTransparentColor(255,255,255);
                        load_image := alpha.SetOpaque(load_image,alpha.GetAlphaLevels);
                       
                        DrawImage(load_image, pw, ph);
                       
                        repaint;
                        delay(2);
               
                end;
set_color(255,255,255);
                drawText('Hello world!', 0, 0);
                repaint;       
                delay(2000);
end.


ViNT 04.07.2008 15:29

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

GOODBYTE 04.07.2008 15:32

Ответ: Lib_alpha: Прозрачность картинок
 
ViNT, ну если тогда подумать то оно бы должно было медленно переходить из обычной картинки в прозрачную. Но этого почему то не происходит, хотя я там задержку же поставил...
попробую еще похимичить

ViNT 04.07.2008 15:37

Ответ: Lib_alpha: Прозрачность картинок
 
Где ж оно будет переходить если написано:
load_image := alpha.SetOpaque(load_image,alpha.GetAlphaLevels);?
Во-первых, нужно поставить i вместо выделенного, во-вторых, картинку каждый раз нужно грузить снова, т.к. он уже после первой обработки не содержит ни одного белого пиксела.

Тогда уж так:
Код:

uses alpha;

var        load_image,im : image;
                        im_h, im_w, h, w, ph, pw, i : integer;

begin
       
        load_image := loadImage('/img.png');
       
        h  := getHeight;
        w := getWidth;
        im_w := getImageWidth(load_image);
        im_h := getImageHeight(load_image);
       
        (* вычиселение новых координат :) *)
       
        ph := h / 2;
        pw := (w / 2) - (im_w / 2);

        alpha.SetTransparentColor(255,255,255);
        setColor(0, 0, 0);
        for i := alpha.GetAlphaLevels downto 0 do
        begin
        FillRect(0, 0, w, h);
  im := alpha.SetOpaque(load_image,I);
        DrawImage(im, pw, ph);
  repaint;
        delay(10);
        end;
       
setcolor(255,255,255);
                drawText('Hello world!', 0, 0);
                repaint;       
                delay(2000);
end.


GOODBYTE 04.07.2008 18:17

Ответ: Lib_alpha: Прозрачность картинок
 
уф, логику нарушил. спс )

InkutaY 04.07.2008 23:37

Ответ: Lib_alpha: Прозрачность картинок
 
А можно в стелать процедуру в библиотеку, что бы она меняла в картинке определенный цвет на другой?

odd 05.07.2008 03:29

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

Сообщение от InkutaY (Сообщение 81741)
А можно в стелать процедуру в библиотеку, что бы она меняла в картинке определенный цвет на другой?

Да легко. Скоро будет. Ждите.

Кстати, для новичков: GetAlphaLevels по-идее возвращает 256 в то время как максимальная принимаемая функцией SetOpaque прозрачность равна 255. Намёк ясен?

Кстати, в функции SetTransparentColor порядок цветов нарушен. Надо RGB, а там BGR какой-то получился. :) Пофиксю одновременно с выходом функции замены одного цвета на другой.

InkutaY 05.07.2008 03:32

Ответ: Lib_alpha: Прозрачность картинок
 
Класно!, буду ждать :) спс

ViNT 05.07.2008 14:46

Ответ: Lib_alpha: Прозрачность картинок
 
odd, советую в новой версии сделать возможность задания прозрачного/заменяемого цвета в формате ARGB, а не RGB, и функцию для определения цвета указанного пикселя в ARGB формате.

odd 06.07.2008 03:34

Ответ: Lib_alpha: Прозрачность картинок
 
Вложений: 1
Цитата:

Сообщение от ViNT (Сообщение 81756)
odd, советую в новой версии сделать возможность задания прозрачного/заменяемого цвета в формате ARGB, а не RGB, и функцию для определения цвета указанного пикселя в ARGB формате.

Хорошо, добавлю. А пока держите RGB версию. Добавлена функция замены цвета ReplaceColor.

odd 08.07.2008 08:41

Ответ: Lib_alpha: Прозрачность картинок
 
Вложений: 1
Как и обещал, всё сделал. Держите.

Пример выполнения:
Код:

Program AlphaTest;
Uses        alpha;
Var        im: image;
Begin
        im:=LoadImage('/world.png'); // Загружаем картинку
        DrawImage(im, 5, 5); // Рисуем её
        im:=SetOpaque(im, 127); // Ставим общую прозрачность картинки на 50%
        im:=ReplaceColor(im, GetColor(im, 0, 0), 0); // Заменяем цвет фона на прозрачный
        DrawImage(im, 25, 25); // Рисуем вторую картинку чуть ниже для сравнения
        Repaint; Delay(10000);
End.

Добавлена функция GetColor(image im, int x, int y) которая возвращает цвет пиксела в картинке с выбранными координатами в ARGB формате.

beisik 14.07.2008 23:19

Ответ: Lib_alpha: Прозрачность картинок
 
Отличная библиотека, но бесит тот факт, что если в картинке уже есть прозрачность, то SetOpaque ее полностью убирает ):

odd 15.07.2008 07:58

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

Сообщение от beisik (Сообщение 82273)
Отличная библиотека, но бесит тот факт, что если в картинке уже есть прозрачность, то SetOpaque ее полностью убирает ):

Меня лично ничего не бесит. Просто потом делаешь ReplaceColor на полностью прозрачный и всё.

Cliffe Snake 22.09.2008 07:17

Ответ: Lib_alpha: Прозрачность картинок
 
Ещё неплохо бы задавать прозрачность в функциях в процентах(0-100), а не числом(0-255). Хотя в принципе и так сойдет, спасиб за библу =)

Cliffe Snake 23.10.2008 00:38

Ответ: Lib_alpha: Прозрачность картинок
 
Odd, добавь пожалуйста в свою либу функции(ю) изменения уровней R,G,B каналов, очень надо=)

odd 24.10.2008 06:44

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

Сообщение от Cliffe Snake (Сообщение 89278)
Odd, добавь пожалуйста в свою либу функции(ю) изменения уровней R,G,B каналов, очень надо=)

В смысле? Например, добавить в картинку больше зеленого или красного на выбор? Так? Ты хочешь чтобы при убийстве героя экран как бы постепенно краснел? Я правильно понял?

Cliffe Snake 24.10.2008 16:41

Ответ: Lib_alpha: Прозрачность картинок
 
Можно и такой вариант, если не трудно.
А я имел ввиду что-то вроде этого:
Код:

....
newimg:=alpha.red(img, -20); {уменьшить уровень красного в картинке на 20}
либо такой вариант(наверно получше):
newimg:=alpha.blue(img, 255); {установить уровень синего в 255}
....


odd 25.10.2008 06:30

Ответ: Lib_alpha: Прозрачность картинок
 
Ладно, я попробую такое написать. Но можно обойтись и без всего этого.
Просто, допустим, тебе надо чтобы экран постепенно покраснел.
Делаешь снимок экрана и в цикле генерируешь красный прямоугольник размером с экран. Причем у этого крассного прямоугольника цвет должен быть как и обычно FF0000, а вот прозрачность постепенно будет меняться от 0 до FF (шаг подберешь сам). Теперь просто выводишь свой снимок, а поверху его выводишь сгененрированный прямоугольник. Всё просто. Ах да. За генерирование прямоугольника отвечает функция CreateCursor из либы Menu32. Если у тебя есть главное меню в программе, то эту либу и не надо добавлять.

Phantom 25.10.2008 09:27

Ответ: Lib_alpha: Прозрачность картинок
 
Я рассказывал, как мой сименс забавно реагирует на полупрозрачность? =)

Cliffe Snake 11.12.2008 10:10

Ответ: Lib_alpha: Прозрачность картинок
 
Срочно нужна функция обратная Alpha.TranslateColor(a,r,g,b).
Или расскажите как из ARGB-формата вытащить R, G и B.
Вот примеры основных цветов:
BLACK=-16777216;
MAGENTA=-65281;
BLUE=-16776961;
RED=-65536;
GREEN=-16711936;
Я хз чё с ними делать.

odd 11.12.2008 22:16

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

Сообщение от Cliffe Snake (Сообщение 92008)
Срочно нужна функция обратная Alpha.TranslateColor(a,r,g,b).
Или расскажите как из ARGB-формата вытащить R, G и B.
Вот примеры основных цветов:
BLACK=-16777216;
MAGENTA=-65281;
BLUE=-16776961;
RED=-65536;
GREEN=-16711936;
Я хз чё с ними делать.

Открой виндовый калькулятор и переведи все эти числа в HEX. Дальше, я думаю будет понятно. Получится, что каждые 2 буквы будут отвечать за определенный цвет, к примеру: FFAABBCC - FF - прозрачность (255), AA - красный компонент (170), BB - зеленый компонент (187), СС - синий (204). Всё просто. Первые символы FFFF FFFF игнорируешь.

Cliffe Snake 12.12.2008 07:00

Ответ: Lib_alpha: Прозрачность картинок
 
разобралси: Чтобы перевести ARGB в RGB надо прибавить к нему 16777216, а потом уж вытигивать цвета div'ом и mod'ом.
Это будет работать для непрозрачных цветов, с полупрозрачными может быть и нет.
Кому надо, вот соответствующие функции на MP:
PHP код:

Function blue(color:integer):integer;
Begin
color
:=color+16777216;
blue:=color mod 256;
end;

Function 
green(color:integer):integer;
Begin
color
:=color+16777216;
color:=color div 256
green:=color mod 256
end;

Function 
red(color:integer):integer;
Begin
color
:=color+16777216;
color:=color div 65536;
red:=color mod 256
end


odd 14.12.2008 22:49

Ответ: Lib_alpha: Прозрачность картинок
 
А ещё легче это делать с помощью библиотеки Lib_bits. Тогда весь код в одну строчку уместится. Что-то типа такого:
PHP код:

blue:=scroll_right(color AND 255);
...
green:=scroll_right(color AND 65280);
...
red:=scroll_right(color AND 16711680); 


CRASHER 20.08.2010 14:42

Ответ: Lib_alpha: Прозрачность картинок
 
Мне бы такая либа на блитзе не помешалаб. Ни кто мне с этим не сможет помоч?)

ViNT 20.08.2010 16:00

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

Сообщение от CRASHER (Сообщение 159076)
Мне бы такая либа на блитзе не помешалаб. Ни кто мне с этим не сможет помоч?)

По блитзу лучше у блитзеров спрашивать :) А вообще, суть состоит в изменении значения байта прозрачности в ARGB значении цвета.

CRASHER 20.08.2010 19:49

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

Сообщение от ViNT (Сообщение 159095)
По блитзу лучше у блитзеров спрашивать :) А вообще, суть состоит в изменении значения байта прозрачности в ARGB значении цвета.

А у тебя нет исходника хотябы накаком нибудь языке?)

ViNT 21.08.2010 04:26

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

Сообщение от CRASHER (Сообщение 159158)
А у тебя нет исходника хотябы накаком нибудь языке?)

По идее, как-то так:
PHP код:

var
 
t:Integer;//Значение прозрачности
 
C:Integer;//Цвет в формате RGBA

begin
 t
:=t shl 24//Сдвиг на 3 байта (24 бита) влево
 
C:=and $FFFFFF xor t//$FFFFFF=16777215 
end

И так каждый пиксел.
Код на паскале, думаю по комментариям понятно.

А вообще, неужели в блитзе нет подобной функции?

CRASHER 21.08.2010 15:21

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

А вообще, неужели в блитзе нет подобной функции?
Что то подобное я встречал, но там только определенный цвет берется, а не массив цветов.

Rameron 13.11.2010 01:07

Ответ: Lib_alpha: Прозрачность картинок
 
А можно в данной библиотеке реализовать, что-бы можно было указывать чувствительность ReplaceColor? А то данная функция очень полезна для смены, к примеру, фонов изображения, но заменяет только конкретный цвет, что при замене оставляет не закрашенные пиксели другого оттенка, но того же цвета, что негативно влияет на однородность закраски.:)

odd 13.11.2010 01:26

Ответ: Lib_alpha: Прозрачность картинок
 
Гм. Реализовать-то можно, но скорость замены цвета сильно упадет.
Может легче обработать картинку в фотошопе и заменить цвет на однородный?

Rameron 18.11.2010 12:01

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

Сообщение от odd (Сообщение 168422)
Гм. Реализовать-то можно, но скорость замены цвета сильно упадет.
Может легче обработать картинку в фотошопе и заменить цвет на однородный?

Я так делал, но при сохранении картинки, однородный цвет в связи с сохранением не с 100% качеством, размывается на оттенки.


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

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