Java (J2ME) преобразует изображение в байт [], затем обратно в изображение - PullRequest
3 голосов
/ 28 февраля 2009

Я пытаюсь преобразовать объект Image в байтовый массив, а затем обратно в изображение (чтобы я мог сохранить изображение в объекте BLOB-объекта в базе данных Apache Derby).

Я могу преобразовать изображение в байтовый массив (код ниже), но не могу преобразовать байты обратно в изображение. В качестве дополнительного осложнения я использую J2ME, поэтому я не могу использовать javax.image. *. Вы можете помочь?

Спасибо

package six.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver; 
import java.awt.Component; 
import java.awt.MediaTracker;
import java.awt.Graphics;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.PixelGrabber;
import java.util.ArrayList;

public class ImageConverter extends Component
{

private MediaTracker mediaTracker;
private Image image;

private ImageConverter(Image image)
{
    super();
    this.mediaTracker = new MediaTracker(this);
    this.mediaTracker.addImage(image, 0);
    this.image = image;
}

private BufferedImage convert()
{
    /*
     * Have to wait for image to load.
     */
    try
    {
        this.mediaTracker.waitForID(0);
    }catch(InterruptedException e)
    {

    }
    System.out.println("-1");

    GraphicsConfiguration graphicsConfig = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    BufferedImage bimage = graphicsConfig.createCompatibleImage(this.image.getWidth(null),this.image.getHeight(null));
    System.out.println("-2");
    Graphics g = bimage.getGraphics();
    g.drawImage(image, 0, 0, null);
    return bimage;
}

private static byte[] convertIntToByteArray(int integer)
{
    byte[] bytes = new byte[4];
    bytes[0] =(byte)( integer >> 24 );
    bytes[1] =(byte)( (integer << 8) >> 24 );
    bytes[2] =(byte)( (integer << 16) >> 24 );
    bytes[3] =(byte)( (integer << 24) >> 24 );
    return bytes;
}

private static int convertByteArrayToInt(byte[] bytes)
{
    return (bytes[0] << 32) | (bytes[1] << 24) | (bytes[2] << 16) | (bytes[3] << 8) | bytes[4];
}

private static byte[] convertIntArrayToByteArray(int[] integers)
{
    byte[] bytes = new byte[integers.length*4];
    for (int index = 0; index < integers.length; index++)
    {
        byte[] integerBytes = convertIntToByteArray(integers[index]);
        bytes[index*4] =        integerBytes[0];
        bytes[1 + (index*4)] = integerBytes[1];
        bytes[2 + (index*4)] = integerBytes[2];
        bytes[3 + (index*4)] = integerBytes[3];
    }
    return bytes;
}

private static int[] convertByteArrayToIntArray(byte[] bytes)
{
    ArrayList integers = new ArrayList();
    for (int index = 0; index < bytes.length; index += 4)
    {
        byte[] fourBytes = new byte[4];
        fourBytes[0] = bytes[index];
        fourBytes[1] = bytes[index+1];
        fourBytes[2] = bytes[index+2];
        fourBytes[3] = bytes[index+3];
        int integer = convertByteArrayToInt(fourBytes);
        integers.add(new Integer(integer));
    }
    int[] ints = new int[bytes.length/4];
    for (int index = 0; index < integers.size() ; index++)
    {
        ints[index] = ((Integer)integers.get(index)).intValue();
    }
    return ints;
}

public static byte[] convertToBytes(Image image)
{
    System.out.println("A");
    ImageConverter converter = new ImageConverter(image);
    System.out.println("B");
    BufferedImage bufferedImage = converter.convert();
    System.out.println("C");
    PixelGrabber pixelGrabber = new PixelGrabber(image,0,0,bufferedImage.getWidth(),bufferedImage.getHeight(),true);
    System.out.println("D");
    try
    {
        if(pixelGrabber.grabPixels())
        {
            Object pixels = pixelGrabber.getPixels();
            if (pixels instanceof byte[])
            {   
                return (byte[])pixels;
            }
            return convertIntArrayToByteArray((int[])pixels);
        }
    }catch(InterruptedException e)
    {
    }
    return null;
}


 }

Ответы [ 2 ]

3 голосов
/ 20 апреля 2009

Я не знаю о javame, но разве это не сработает?

javax.microedition.lcdui.Image.createImage(new ByteArrayInputStream(byte[]))
1 голос
/ 28 февраля 2009

Чтобы воссоздать изображение, вы можете использовать метод createRGBImage в классе Image (http://java.sun.com/javame/reference/apis/jsr118/),), но помните, что вы используете 4 байта для каждого пикселя в изображении. Изображение с шириной 200 x 200 пикселей будет иметь в общей сложности 40000 пикселей, что займет 160 КБ памяти в мобильном устройстве.

Я работал с изображениями в J2ME раньше, но только отправлял изображения с сервера на клиент. В этом случае вы можете изменить разрешение изображения на сервере (где у вас есть код и все возможности), закодировать его в формате JPEG и затем отправить его клиенту. Метод Image.createImage (...) может создать изображение в любом кодированном формате, поддерживаемом механизмом J2ME, на котором выполняется приложение. Я верю, что JPEG всегда будет принят.

Даже если вам понадобятся эти изображения для будущего использования, вы можете сохранить буфер байтов [], возвращенный сервером, в хранилище записей, а затем использовать его.

...