В j2me Как сохранить изображение в памяти телефона для s40? - PullRequest
2 голосов
/ 10 ноября 2011

Изображения локально сохраняются в этом приложении. Я хочу сохранить изображение из приложения j2me в память телефона. Есть ли какой-либо кодировщик или преобразовать байтовый массив? Как его сохранить? Пожалуйста, помогите мне ....

        try {


        String url=System.getProperty("fileconn.dir.photos")+"model0_0.jpg";

        FileConnection fc=(FileConnection)Connector.open(url,Connector.READ_WRITE);
        if(!fc.exists()) {

            fc.create();
        }else {
            //  return;
        }


        OutputStream os=fc.openOutputStream();
        int iw=galleryImage.getWidth();int ih=galleryImage.getHeight();
        rawInt=new int[iw*ih];
        galleryImage.getRGB(rawInt,0,iw,0,0,iw,ih);
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        for(int i=0;i<rawInt.length;i++)
            baos.write(rawInt[i]);
        byte byteData[]=baos.toByteArray();
        baos.close();
        ByteArrayInputStream b_stream=new ByteArrayInputStream(byteData);
        int i=0;
        /*while((i=b_stream.read())!=-1) {
            os.write(i);
        }*/

        for( i=0;i<content.length;i++) {
            os.write(b_stream.read());
        }

        //os.write(byteData);
        os.flush();
        os.close();
        System.out.println("\n\nImage Copied..\n");

        fc.close();

    } catch (IOException e) {
        //System.out.println("image not read for gallery");
        e.printStackTrace();
    }
    catch(java.lang.IllegalArgumentException iae){iae.printStackTrace();}
    catch(Exception e){e.printStackTrace();}

Я попробовал этот код. Когда один неформатированный файл хранится в папке с изображениями по умолчанию. Размер файла составляет 0,0 КБ. Думаю, изображение не читается ............

Ответы [ 2 ]

2 голосов
/ 16 ноября 2012

JPGEncoder - действительно хороший фрагмент программного обеспечения, и он хорошо работает на устройствах с ограниченными ресурсами.Однако он основан на библиотеке JIMI от Sun, которая теперь принадлежит Oracle.Условия лицензии Oracle несколько допустимы, но они запрещают использование на встроенных устройствах, таких как мобильные телефоны.В зависимости от вашей ситуации это может быть демонстрация.

1 голос
/ 16 февраля 2012

Если у вас есть данные RGBA из изображения, вы должны закодировать их перед сохранением, поэтому найдите подходящий кодер для ваших целей. Вы можете использовать формат png для всех программ j2me. Во-первых, вы хотели бы получить данные RGBA из изображения:

/**
   * Gets the channels of the image passed as parameter.
   * @param img Image
   * @return matrix of byte array representing the channels:
   * [0] --> alpha channel
   * [1] --> red channel
   * [2] --> green channel
   * [3] --> blue channel
   */

public byte[][] convertIntArrayToByteArrays(Image img) {
int[] pixels = new int[img.getWidth() * img.getHeight()];
img.getRGB(pixels, 0, img.getWidth(), 0, 0, img.getWidth(), 
           img.getHeight());

// separate channels
byte[] red = new byte[pixels.length];
byte[] green = new byte[pixels.length];
byte[] blue = new byte[pixels.length];
byte[] alpha = new byte[pixels.length];

for (int i = 0; i < pixels.length; i++) {
  int argb = pixels[i];
  //binary operations to separate the channels
  //alpha is the left most byte of the int (0xAARRGGBB)
  alpha[i] = (byte) (argb >> 24);
  red[i] = (byte) (argb >> 16);
  green[i] = (byte) (argb >> 8);
  blue[i] = (byte) (argb);
}

return new byte[][]{alpha, red, green, blue};
}   

Теперь загрузите класс PNG.java из здесь . В этом классе мы имеем:

toPNG(int,int,byte[],byte[],byte[],byte[])

Первые целые числа - это ширина и высота изображениямассивы байтов расположены по порядку: альфа, красный, зеленый и ... синий. Ширина и высота довольно просты: + getWidth (): int и + getHeight (): int из объекта Image (как вы это сделали) идругие зарабатываются ** convertIntArrayToByteArrays **:

byte[][] rgba = convertIntArrayToByteArrays(galleryImage);
byte[] encodeImage = toPNG(galleryImage.getWidth(),galleryImage.getHeight(),rgba[0] ,rgba[1] ,rgba[2],rgba[3]);   

Теперь вы можете сохранить encodeImage в файле с помощью fileconnection.
Если вам нравится сохранять изображение в формате jpeg, скачайте com.encoder.jpg из здесь , затем:

import com.encoder.jpg.*;

//your input image
Image image = Image.createImage(128, 128);

JPGEncoder encoder = new JPGEncoder();
int quality = 65;
byte[] encodedImage = encoder.encode(image, quality);

//now save or send encoded jpeg image   

Наконец, вы можете использовать MediaProcessor из jsr234:

//Create MediaProcessor for raw Image
MediaProcessor mediaProc = GlobalManager.createMediaProcessor("image/raw");
//Get control over the format
ImageFormatControl formatControl = (ImageFormatControl)
        mediaProc.getControl("javax.microedition.amms.control.ImageFormatControl");
//Set necessary format
formatControl.setFormat("image/jpeg");   

Ссылки:
stackoverflow
Java-н-я

...