Просмотр полной версии : Как отобразить (или повернуть) картинку (напр, слева направо) средствами MIPD 1.0?
Подскажите, пожалуйста, как отобразить (или повернуть) картинку (напр, слева направо) средствами MIPD 1.0?
А то у меня мидлет слишком много места занимает, а в нём одна половина картинок является отражением другой половины. К примеру, картинка человечка, который смотрит налево, и рядом ещё одна картинка того же человечка, который смотрит направо. Нельзя ли сделать одну картинку, и в самой игре уже использовать отражённую?
(Для Motorola T720, поддерживаеься только MIDP 1.0)
Может кто-нибудь так делал? Подскажите как?
UstasAlex
11.02.2004, 16:27
Ну а в чем сложность-то ?
Если Вы знакомы с MIDP 1.0 API - там даже пример есть :
Image source; // the image to be copied
source = Image.createImage(...);
Image copy = Image.createImage(source.getWidth(), source.getHeight());
Graphics g = copy.getGraphics();
g.drawImage(source, 0, 0, TOP|LEFT);
Хм..правда это будет просто копия - в ней нужно еще байты поменять местами, чтобы картинку повернуть.
В обычной Java есть класс ImageProducer, здесь его похоже выкинули - будем разбираться !
Эх! Бодрое начало!
Жаль этим всё и закончилось :(
UstasAlex
12.02.2004, 10:08
Да не закончилось.. :)
Правда, вынужден Вас огорчить - в MIDP 1.0 оставлено минимум функциональности.
Но в MIDP 2.0 появился новый метод:
public static Image createImage(Image image,
int x,
int y,
int width,
int height,
int transform)
Последний аргумент (transform) позволяет поворачивать картинку или отражать ее относительно вертикальной оси.
Есть одна идея насчет MIDP 1.0
1. прочитать файл с рисунком как последовательность байт
2. поменять байты местами учитывая спецификацию PNG
(cм. http://www.ietf.org/rfc/rfc2083.txt (здесь) )
3. создать новый Image с помощью метода
public static Image createImage(byte[] imageData,
int imageOffset,
int imageLength)
Будут вопросы - пишите !
Ха!
Вы мне глаза не открыли! И проблему решить не помогли!
MIDP 1.0 - жёсткое ограничение!
Но всё-равно спасибо за поддержку :)
По поводу открытия картинки потоком из файла: была такая идея. Попробую.
Спасибо за ссылку на спецификацию.
Кстати, нажми на ссылку, что выложил.
Кажется, кое-что надо поменять местами :)
UstasAlex
13.02.2004, 13:32
Да, ошибку заметил :) но редактировать не получается.
Кстати - алгоритм разбора PNG файлов, а также механизм поворота есть в исходниках. А именно - MIDP 1.0/2.0 Sun Reference Implementation.
здесь (http://java.sun.com/products/midp/index.jsp)
Правда, алгоритм естественно написан на C, т.к. вызывается из Java через native вызовы.
Кстати в MIDP используется не стандартная JVM
(Java Virtual Machine) а урезанная KVM. И одной из особенностью является то, что вызовы между Java и C кодом реализованы НЕ с помощью JNI (Java Native Interface). Но думаю, что разберетсь (дам только один hint - параметры в native функцию передаются не явным образом, а кладутся на стек).
Кстати попутно Вам вопрос - можно ли в своих мидлетах для мобильников объявлять метод как native ?
И последнее (из Вашей дискуссии на другом форуме) -
сборка мусора (Garbage Collection) имеет отношение ТОЛЬКО к объектам (!). Примитивные типы данных к таковым не относятся и память освобождается сразу же после выхода из области видимости (scope). Ссылок (refernce) на них вы создать не можете, а при вызове и возврате из фунцкий будет возвращаться ЗНАЧЕНИЕ, т.к. в Java праметры передаются только(!) по значению.
А вот массивы примитивных типов УЖЕ ЯВЛЯЮТСЯ объектами
(например у них есть св-во length) и к ним применимы понятия сборка мусора, ссылки и проч.
tequilacat
24.05.2004, 13:19
Подскажите, пожалуйста, как отобразить (или повернуть) картинку (напр, слева направо) средствами MIPD 1.0?
С помощью setClip. обрабатывается попиксельно, прямой доступ к байтам имиджа не требуется (на Нокия есть такой)
пример - поворот Image на 90 градусов clockwise. Mirror делается аналогично.
public static Image transposeBitmap(Image bitmap){
Image transposed = Image.createImage(bitmap.getHeight(), bitmap.getWidth());
Graphics g = transposed.getGraphics();
// transpose
int maxX = bitmap.getWidth(), maxY = bitmap.getHeight();
for(int x = 0; x < maxX; x++){
for(int y = 0; y < maxY; y++){
int px = maxY-y-1, py = x;
g.setClip(px, py, 1,1);
g.drawImage(bitmap, px-x, py-y, g.LEFT|g.TOP);
}
}
return transposed;
}
Насколько поточечный метод вывода медленней однократного?
С помощью setClip. обрабатывается попиксельно, прямой доступ к байтам имиджа не требуется (на Нокия есть такой)
пример - поворот Image на 90 градусов clockwise. Mirror делается аналогично.
public static Image transposeBitmap(Image bitmap){
Image transposed = Image.createImage(bitmap.getHeight(), bitmap.getWidth());
Graphics g = transposed.getGraphics();
// transpose
int maxX = bitmap.getWidth(), maxY = bitmap.getHeight();
for(int x = 0; x < maxX; x++){
for(int y = 0; y < maxY; y++){
int px = maxY-y-1, py = x;
g.setClip(px, py, 1,1);
g.drawImage(bitmap, px-x, py-y, g.LEFT|g.TOP);
}
}
return transposed;
}
Хм... Здорово! Действительно, можно было бы самому догадаться! :)
Вопрос по скорости тоже очень интересует. ???
tequilacat
25.05.2004, 13:01
на Motorola T720 имидж 128x128 поворачивался 10 сек (не самый медленный аппарат, SE t610 тормознее)
в гейме каждый кадр так не покрутишь, но разок при инициализации мидлета - уже обсуждаемо.
жаль только его в RMS потом закешировать нельзя.
> Насколько поточечный метод вывода медленней однократного?
конечно, медленнее! во много раз :) насколько - зависит от CPU и JVM.
но если однократный способ аппаратом не поддерживается, выбирать не из чего
Т.е. можно один раз вывести на экран картинку, а потом её сохранить и выводить постоянно???
tequilacat
26.05.2004, 13:19
ну да - создать отображённый Image в startApp(), а дальше его юзать где хочешь.
По-моему не стоит овчинка яйца выеденного если придется ждать загрузки на 10 секунд дольше
tequilacat
26.05.2004, 14:28
возможно, действительно проще шипить и прямую повёрнутую копию.
кстати я потом отказался от такого метода.
но в некоторых случаях это может быть полезным. для маленьких картинок, на быстрых телефонах итд.
Powered by vBulletin™ Version 4.1.7 Copyright © 2012 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot