|
28.06.2008, 08:24
|
#1
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
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.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.06.2008, 22:36
|
#2
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Не знаю, у меня на SE все работает без ошибок, правда картинка какая-то синюшная получается.
|
(Offline)
|
|
30.06.2008, 19:46
|
#3
|
AnyKey`щик
Регистрация: 14.06.2008
Сообщений: 13
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
odd, а можете этот код сделать в библиотеку? а то компилятора нет. А библиотека такая нужна. Пусть даже если не совсем доработанную.
|
(Offline)
|
|
30.06.2008, 20:21
|
#4
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Да похоже она вообще не работает.
Картинка получается такая, как будто изменяется не alpha-канал, а канал синего.
|
(Offline)
|
|
30.06.2008, 21:56
|
#5
|
AnyKey`щик
Регистрация: 14.06.2008
Сообщений: 13
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
ViNT, ну выложи class файл. пожалуйста.
|
(Offline)
|
|
30.06.2008, 22:42
|
#6
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Вот, но похоже она делает не то, что нужно.
|
(Offline)
|
|
01.07.2008, 08:30
|
#7
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Что-то не так. У меня на SE K550i вобще не запускается. А в эмуляторе пишет, что ошибка валидации класса. Ещё мозгую над проблемой...
|
(Offline)
|
|
01.07.2008, 11:42
|
#8
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
А чем компилил?
Я иногда пытался компилить либы напрямую через javac (из wtk), так он мне тоже часто(но, что интересно, не всегда) писал ошибку верификации класса, хотя компиляция проходила нормально. Сейчас компилю через JB, все нормально, только изображение явно получается с измененным каналом синего, как будто не на тот байт маска накладывается.
|
(Offline)
|
|
01.07.2008, 14:53
|
#9
|
AnyKey`щик
Регистрация: 14.06.2008
Сообщений: 13
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: 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.
А меня вот при таком коде картинка становится все синее и синее. Наоборот наверное не синий изменяется цвет а какой то другой уменьшается. А синий из-за этого выделяется. Хотя я не знаю буду ждать готовую библиотеку. Заранее спасибо
|
(Offline)
|
|
01.07.2008, 15:17
|
#10
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Ну так, от 1 до 255 повышаем значение BB байта, получаем все более синюю картинку.
|
(Offline)
|
|
01.07.2008, 18:51
|
#11
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
формат цветности aarrggbb, т.е. четыре байта. вы сдвигаете на 64 бита - это 8 байт, т.е. получается 2 раза по кругу.
|
(Offline)
|
|
02.07.2008, 03:11
|
#12
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Я уже сделал по-другому. Ошибки валидации теперь нет.
Правда и прозрачности я тоже не увидел
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.
|
(Offline)
|
|
02.07.2008, 14:43
|
#13
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Извиняюсь, что вмешиваюсь , но как-то у вас тут все затянулось.
Правда проверял только на Мотороле.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.07.2008, 20:58
|
#14
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Добавил все новые библиотеки в список.
|
(Offline)
|
|
03.07.2008, 07:56
|
#15
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Lib_alpha: Прозрачность картинок
Гениально. Оказывается нужно было просто добавить маскировку and 0x00FFFFFF.
На SE пашет. Добавил библиотеку в коллекцию.
Спасибо, pilgrim!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:27.
|