forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JAVA Micro Edition (http://forum.boolean.name/forumdisplay.php?f=52)
-   -   Хранение картинок в классах (http://forum.boolean.name/showthread.php?t=6239)

Phantom 12.08.2008 07:02

Хранение картинок в классах
 
Целую ночь лажу в интернете, но так и не нашёл ответ на вопрос: как хранить картинки (и вообще разные ресурсы) внутри классов? Первое и последнее, что пришло на ум - хранить картинку в виде hex строки и из неё создавать имэдж. Но я не знаю как это сделать :dontknow: ... Также терзает мысль, что можно даже не строку хранить, а просто каким-то образом в креатИмэдж засунуть 0xHEXBYTESPICTURES... В общем, помогите...

ViNT 12.08.2008 13:14

Ответ: Хранение картинок в классах
 
Записать данные напрямую похоже не получится - пробовал по-разному записывать данные в класс - мидлет не запускается, видимо, класс получается некорректным. С exe-шниками, помню, такое делал, а с .class не получается.
Если только переводить ресурс в HEX, но тогда он будет занимать в 2 раза больше места и декодироваться будет долго.

Piligrim 12.08.2008 22:41

Ответ: Хранение картинок в классах
 
как вариант хранить в int массиве, только он должен быть
final static int чтобы компилятор его за константу принял. Одно число это 4 байта.

ViNT 13.08.2008 01:21

Ответ: Хранение картинок в классах
 
Все равно надо писать программу, формирующую этот самый массив, хотя это уже ерунда. Кстати, интересно, дельфовский TColor это то же самое, что и числа в массиве RGB в java, или там байты переставлены?

Phantom 13.08.2008 01:24

Ответ: Хранение картинок в классах
 
Цитата:

Если только переводить ресурс в HEX, но тогда он будет занимать в 2 раза больше места и декодироваться будет долго.
Места-то пускай больше занимает, после запаковки в zip текстовые hex данные должны хорошо сжаться.
как вариант хранить в int массиве, только он должен быть
Цитата:

final static int чтобы компилятор его за константу принял. Одно число это 4 байта.
Почти ничего не понял =(

Phantom 13.08.2008 01:25

Ответ: Хранение картинок в классах
 
Массив RGB в текстовом виде кода джавы из картинки я могу на PHP сделать =)

ViNT 13.08.2008 01:27

Ответ: Хранение картинок в классах
 
Цитата:

Сообщение от Phantom_wc (Сообщение 84344)
Массив RGB в текстовом виде кода джавы из картинки я могу на PHP сделать =)

Да проще на Delphi написать.

Phantom 13.08.2008 01:37

Ответ: Хранение картинок в классах
 
А я Делфи не знаю и компилятора нет у меня...

Phantom 13.08.2008 01:51

Ответ: Хранение картинок в классах
 
Только вот как в массив вносить? Каждый пиксель отдельно? Типа так:
PHP код:

int pixel[]=null;
pixel=new int[100];
pixel[0]=0xaabbccdd;
pixel[1]=0xaadd0000;
pixel[2]=0xaaddaa00;
 . . .
pixel[97]=0xaacccccc;
pixel[98]=0xaa00ff00;
pixel[99]=0xaafbfbfb


Piligrim 13.08.2008 02:11

Ответ: Хранение картинок в классах
 
final static int arr[] = {0x00001, 0x00003};

Phantom 13.08.2008 02:55

Ответ: Хранение картинок в классах
 
Ааа... А чем final отличается от public? А то я везде public пишу... Уфф... Джава такая сложная, по мне так в ней много лишнего и мало нужного...
- - -
Пардон, немного не так вопрос задал. Ща исходники смотрел, можно использовать и паблин и финал одновременно... Но что такое финал я так и не понял.

ViNT 13.08.2008 03:19

Ответ: Хранение картинок в классах
 
Вложений: 1
Вот программка, переносишь на неё bmp-файл, и получашь в той же папке файл "<имя_файла_изображения>.java" вида
PHP код:

public static final int[] rgb_data={0,0,0.............};
 public static final 
int width=<ширина изображения>;
 public static final 
int height=<высота изоьражения>; 

Дальше, допустим, создешь файл Lib_resoutce.java в ктотром пишешь:
PHP код:

import javax.microedition.lcdui.Image;

public class 
Lib_resource{

/*СЮДА ДАННЫЕ ИЗ СОЗДАННОГО ПРОГОЙ ФАЙЛА*/

publc Lib_resource(){}

    public static 
Image return_image(){
      return 
Image.createRGBImage(rgb_data,width,height,false);
 }


Компилишь, получаешь библиотеку.
В проекте MP пишешь:
PHP код:

program TstClassRes;
uses resource;
begin
  drawimage
(return_image,0,0);
  
repaint;    
  
delay(20000);
end

У меня вроде работает.

P.S. Модели RGB в java и Delphi не совпали, пришлось байты переставлять.

P.P.S. final это то же самое, что и const в паскале.

Phantom 13.08.2008 03:34

Ответ: Хранение картинок в классах
 
Стоп, стоп, стоп. Я не на мидлет паскале пишу. Точнее... Я, короче, декомпилировал FW.class и M.class (обэчный Хэллоу Ворлд), немного их изменил и на основе их пишу на Джаве, вообще без паскаля =) А за программку спасибо, как раз собирался только что скрипт писать =) Сейчас разберусь, заюзаю =)

Phantom 13.08.2008 03:38

Ответ: Хранение картинок в классах
 
А зачем нужно, чтобы компилятор за констатнту принимал этот массив? А если мне нужно мнооого картинок создать, то придётся несколько констант создавать? Телефон от этого не упадёт? А то бы я просто обычный массив использовал и все картинки по очереди в него перезаписывал...
- - -
А может можно как-то сразу скормить перечисление пикселов в Image.createRGBImage? Чтобы и не создавать переменной новой в программе? Примерно так:

PHP код:

G.drawImage(Image.createRGBImage(int[] {0xffff0000,0xffff0000,0xffff0000,0xffff0000},2,2,true),10,10,G.LEFT|G.TOP); 

Пробовал, не прокатывает. А в php бы прокатило =) Только там array(0xffff0000,0xffff0000,0xffff0000,0xffff0000) надо писать.
- - -
О_о Я кажется понял, зачем нужно константу создавать. Компилятор её заменяет на значение, а JVM потом не требуется выделять память под хранение константы. Верно?

ViNT 13.08.2008 03:49

Ответ: Хранение картинок в классах
 
Все равно их нужно где-то хранить, в константном массиве проще всего.

Phantom 13.08.2008 04:13

Ответ: Хранение картинок в классах
 
Код:

b.java:38: code too large
 public static void R() throws Exception{
                    ^
1 error

Это что? Типа код слишком длинный? Что делать? Это я картинку 160x138 заюзал... А если не bmp и с прозрачностью надо, то твоя прога не сможет сделать?
- - -
Сделал картинку в четыре раза меньше, всё создало, откомпилировало, но мидлет не запускается. Эмулятор сразу при попытке запуска закрывается. Видимо, мы к решению этого вопроса неправильно подошли... Каким-то образом ведь делают так. Пойду декомпильну что-нибудь, может поможет =)

Phantom 13.08.2008 09:01

Ответ: Хранение картинок в классах
 
У меня появилась другая идея =) Как можно считать картинку из файла и преобразовать в объект Image?

ViNT 13.08.2008 13:09

Ответ: Хранение картинок в классах
 
Цитата:

Сообщение от Phantom_wc (Сообщение 84370)
У меня появилась другая идея =) Как можно считать картинку из файла и преобразовать в объект Image?

Я в своей библиотеке делал так:
PHP код:

import java.io.*;
import javax.microedition.lcdui.Image;
import javax.microedition.io.*;

class 
Lib_imloadjsr75 {
public static 
Image img;

public static 
Image loadimage(String filename) {
  try {
    
FileConnection con = (FileConnection)
        
Connector.open("file://" +
                       
filenameConnector.READ);
    
InputStream IS con.openInputStream();
    
img Image.createImage(IS);
    
IS.close();
    
con.close();
  }
  catch (
Exception ex) {}

  return 
img;


}


А вообще, зачем хранить изображения в классах?
Кстати, есть еще вариант: закодировать бинарник PNG чем-нибудь в роде base64 и записать как строковую константу. Места будет занимать мало, только декодировать обратно придется.

Phantom 13.08.2008 14:11

Ответ: Хранение картинок в классах
 
Изображения хочу хранить в классе, чтобы достать их оттуда было непросто =) Ща думаю просто записать в один файл все картинки по очереди без префиксов, а после считать файл из класса, отделить все картинки одну от другой, приделать к каждой префикс, который убрал до записи в файл и создать объект Image.
Твой способ, вроде, не пройдёт... Я половину функций из твоего примера не знаю, но, как я понял, у тебя из потока как бы объект создаётся. К нему, наверно, не получится добавить префикс... Префикс - это, грубо говоря, набор байт или строка. Вот. Что посоветуешь?

ViNT 13.08.2008 14:44

Ответ: Хранение картинок в классах
 
Тогда так:
PHP код:

FileConnection con = (FileConnection
        
Connector.open("file://" 
                       
filenameConnector.READ); 
    
InputStream IS con.openInputStream();
    
    
byte[] im=null;
    
IS.read(im);//читаем данные в массив байт
    //здесь делаем с массивом байт что угодно
    
img=Image.createImage(im,0,im.length);//создаем Image из массива im 

Вот. читаем данные в массив, а дальше изменяем его, как надо.
Потом создаем из него Image.

А если уж очень надо спрятать, тогда лучше шифровать чем-нибудь.

Phantom 13.08.2008 15:06

Ответ: Хранение картинок в классах
 
Ну base64 открытый алгоритм, кто угодно на вид сразу догадается попробовать обратить. Да и от шифрования скорость упадёт. Спрятать нужно не особо. Защиты от дурака хватит =) Попробую с массивом байт.

ViNT 13.08.2008 15:24

Ответ: Хранение картинок в классах
 
Цитата:

Сообщение от Phantom_wc (Сообщение 84396)
Спрятать нужно не особо. Защиты от дурака хватит =)

Ну так тогда PNG задом наперед перевернуть, так многие делают. Мне самому когда такое попалось, я не сразу додумался его HEX-редактором просмотреть. И только когда просмотрел - увидел, что файл задом наперед переписан.

Phantom 13.08.2008 15:24

Ответ: Хранение картинок в классах
 
b.java:49: cannot find symbol
symbol : class FileConnection
location: class b
FileConnection con=(FileConnection)
^
b.java:49: cannot find symbol
symbol : class FileConnection
location: class b
FileConnection con=(FileConnection)
^
2 errors
- - -
Хы, тут тема где-то про картинки в файлах есть, моё сообщение последнее. Я подошёл к расшифровке картинок с полной ответственностью =)
О_о

ViNT 13.08.2008 15:33

Ответ: Хранение картинок в классах
 
Этому коду нужен класс javax.microedition.io.file.FileConnection

Phantom 13.08.2008 15:42

Ответ: Хранение картинок в классах
 
import javax.microedition.io.*; я написал. Не работает. Не может же быть, что... Что у меня его в компиляторе НЕТ О_о ???

ViNT 13.08.2008 17:41

Ответ: Хранение картинок в классах
 
Скорее всего, нет пакета JSR75 API.
Хотя стоп. Имеется в виду чтение из внешнего файла или из ресурса?

Piligrim 13.08.2008 18:53

Ответ: Хранение картинок в классах
 
еще один из способов, замена заголовка %PNG на другие символы или просто удаление, тогда практически все просмотрщики пасуют.

Romanzes 13.08.2008 19:12

Ответ: Хранение картинок в классах
 
Немного не по теме, кто знает, чем редактировать изображения в формате *.bsprite? Не помню, в какой игрушке я это видел, если вспомню, выложу линк.

ViNT 14.08.2008 01:14

Ответ: Хранение картинок в классах
 
Цитата:

Сообщение от Romanzes (Сообщение 84424)
Немного не по теме, кто знает, чем редактировать изображения в формате *.bsprite? Не помню, в какой игрушке я это видел, если вспомню, выложу линк.

Похоже какой-то нестандартный формат.
Скорее всего, либо RAW-данные наподобие BMP, либо сжатые данные, наподобие ZIP. Увидеть бы сам файл.

Phantom 14.08.2008 09:11

Ответ: Хранение картинок в классах
 
Цитата:

Хотя стоп. Имеется в виду чтение из внешнего файла или из ресурса?
Из ресурса, конечно =) Зачем мне зашифрованные картинки с диска читать? гг
Цитата:

еще один из способов, замена заголовка %PNG на другие символы или просто удаление, тогда практически все просмотрщики пасуют.
Я хочу убрать больше даже, там префикс у png длиннее, который одинаковый у всех png'шек. А ещё с конца можно несколько байт удалить (по ним тоже можно догадаться, что это png).
- - -
Зацените, какое я тут расследование провёл:
http://forum.boolean.name/showthread...newpost&t=2086
А то обидно, я часа полтора ковырялся, а никто даже не отписался =(

Romanzes 14.08.2008 09:53

Ответ: Хранение картинок в классах
 
Вот, нашел: 2007_Real_Football

Phantom 14.08.2008 10:35

Ответ: Хранение картинок в классах
 
http://forum.juga.ru/showthread.php?threadid=15945

ViNT 14.08.2008 15:01

Ответ: Хранение картинок в классах
 
Чтение из ресурса делается примерно так:
PHP код:

import javax.microedition.io.*;
import java.io.*;

public class 
ResRead {
  public 
ResRead() {
  }
  
  public 
byte[] getResBytes(String res){
    
InputStream in MyMIDlet.instance.getClass().getResourceAsStream(res);
    
byte[] null;
    try {
      
in.read(b);
      
in.close();
    }
    catch (
Exception ex) {}
    
    return 
b;
  }


Функция getResBytes возвращает массив байт ресурса res.
Здесь - MyMIDlet - главный класс мидлета,
instance - экземпляр главного класса.

P.S. на счет bsprite - явно нестандартный формат. Единственно возможный вариант - попытаться расковырять java - код, но это будет сложно, т.к. мидлет обработан обфускатором.

Romanzes 15.08.2008 00:02

Ответ: Хранение картинок в классах
 
Вот в этой игрушке, по-моему, картинки лежат в классах.

ViNT 15.08.2008 01:18

Ответ: Хранение картинок в классах
 
Цитата:

Сообщение от Romanzes (Сообщение 84485)
Вот в этой игрушке, по-моему, картинки лежат в классах.

Картинки там, похоже, лежат именно в файлах .basprite, ну и пара png-шек есть.

Phantom 15.08.2008 06:16

Ответ: Хранение картинок в классах
 
ViNT, всё компилится, но мидлет повисает при запуске с белым экраном. Картинка не рисуется...
- - -
Убрал эту строку:
G.drawImage(Image.createImage(img,0,img.length),10 ,10,G.LEFT|G.TOP);
мидлет выполняется, не повисает. Что у меня в ней не так? img - это массив байт, который возвращается твоей функцией.
- - -
Эх... Написал так:
PHP код:

if(img!=null){
    
G.drawImage(Image.createImage(img,0,img.length),10,10,G.LEFT|G.TOP);
   } 

Мидлет выполняется, но картинку не рисует. Значит срабатывает исключение в твоей функции. Видимо, это:
in.read(img);
по какой-то причине не работает... В качестве ресурса пытаюсь открыть иконку "/icon.png", которая лежит в jar'е... В чём проблема - ума не приложу...
- - -
СДЕЛАЛ!!! Yahoo!!!
После строки
byte[] b = null;
добавил
b = new byte[284];
284 - это вес иконки =)
Только вот вопрос... А если я наперёд не знаю, сколько весит файл, то как тогда делать?
- - -
Как сделать байтовый массив с заполнением?
PHP код:

byte end[] = {0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82}; 

не катит... Как я понял, пишет, что я пытаюсь в байтовый массив занести числовые значения. гг. А как тогда байты представлять?

ViNT 15.08.2008 14:29

Ответ: Хранение картинок в классах
 
Да забыл инициализировать byte[] b.
А делается это так:
PHP код:

public static byte[] getResBytes(String res){

    
InputStream in=Main.instance.getClass().getResourceAsStream(res);
    
byte[] b=null;
    try{ 
         
=new byte[in.available()];//Инициализация - забыл
        
}catch(Exception e){}
    try {

      
in.read(b);
      
in.close();
    }
    catch (
Exception ex) {/*Main.quitApp();*/}

    return 
b;
  } 

На счет массива - синтаксически вроде все правильно, но матерится на значения 0xae и 0x82. Попробуй вместо них написать (byte)0xae и (byte)0x82. У меня так скомпилилось.

Phantom 16.08.2008 13:51

Ответ: Хранение картинок в классах
 
Уф... Так. Всем спасибо =) Чуть позже, как доделаю, покажу, что получилось. Я тут больше суток тупо сидел и не мог найти ошибку в нескольких строках кода. Всё компилируется, но работает не так, как надо. В итоге, только что понял в чём была ошибка. Я решил хранить ресурсы (картинки) в файле с расширением .class, типа для большего запутывания потенциального взломщика моей мега программы =) Но картинка из всего этого не собиралась! Чуть монитор в окно не выбросил от разочарования в себе... Потом... Только что то есть... Поменял расширение с class на png И ВСЁ ЗАРАБОТАЛО!
Такой вопрос: а в джаве что, имеет какое-то значение расширение файла??? Как я понял, его просто не считывало в байтовый массив! ПОЧЕМУ? Блин, я сутки искал ошибку там, где её не было... Сейчас ещё поиграюсь с расширениями, png не хочу оставлять.

ViNT 16.08.2008 15:03

Ответ: Хранение картинок в классах
 
Расширение значения не имеет, но может именно на использование .class JVM не дает разрешения.

Alex__Noc 21.06.2012 18:47

Ответ: Хранение картинок в классах
 
Phantom , Интересует нарытое))?? ХДЕЕЕЕ?????

Phantom 22.06.2012 01:40

Ответ: Хранение картинок в классах
 
Цитата:

Phantom , Интересует нарытое))?? ХДЕЕЕЕ?????
Идея была херня, забил давно на неё.

Тред вообще можно снести, чтобы мне не приходилось краснеть. :-D


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

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