9
votes

Données brutes au format JPEG - Java

J'ai essayé de convertir des données brutes ByTeArray au format JPEG à l'aide de JPEgenCoder, mais c'est trop lent sur mobile (j'ai testé sur mobile). Comment puis-je faire la même chose en Java? Je vais envoyer un octet de données brut à Java et l'encodera à JPEG avec Java - j'ai essayé certains d'entre eux comme jpegimageencoder sous com.sun. * Mais cela est amorti dans JDK7. Comment puis-je faire cela dans Java ou toute suggestion de Flex Mobile Developers qui ont fait une telle chose?

Mise à jour: J'ai essayé le code suivant, mais je reçois un résultat étrange: p>

public void rawToJpeg(byte[] rawBytes, int width, int height, File outputFile){

        try{

            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

            int count = 0; 
            for(int h=0;h<height;h++){
                for(int w=0;w<width;w++){
                    bi.setRGB(w, h, rawBytes[count++]);
                }
            }


            Graphics2D ig2 = bi.createGraphics();

            Iterator imageWriters = ImageIO.getImageWritersByFormatName("jpeg");
            ImageWriter imageWriter = (ImageWriter) imageWriters.next(); 

            ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
            imageWriter.setOutput(ios);
            imageWriter.write(bi);


        }catch(Exception ex){
            ex.printStackTrace();
        }


    }


6 commentaires

J'ai le même problème. Avez-vous trouvé une solution?


Non, pour l'instant, je fais tout le codage sur le côté du client, mais il faut longtemps pour traiter


Pour moi n'a pas d'importance dans le client ou le serveur, quelle langue et technique utilisez-vous maintenant?


J'utilise Flex Mobile sur le côté du client et je fais un codage en utilisant ActionScript .. Je peux vous le donner si cela vous convient (ce n'est pas une meilleure solution pour moi car il prend un certain temps pour encoder des appareils mobiles sur des appareils mobiles)


Voulez-vous s'il vous plaît envoyez-le-moi (poster à Ehsunbehravesh Dot Com) Cela peut me donner une idée.


JPEG a-t-il alpha? A_RBG pourrait être le problème.


4 Réponses :


1
votes

Pourquoi ne pas utiliser un byteArrayInputStream code> avec imageoIO code>?

Vous trouverez plus d'informations sur ImageOIO dans API . P>

public static void rawToJpeg(byte[] bytes, File outputFile) {
    try {
        BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes));
        ImageIO.write(img, "jpg", outputFile);
    } catch (IOException e) {
        // Handle exception
    }
}


3 commentaires

Bufferedimage img = imageo.read (nouveau byearrayInputStream (Resimbytes)); renvoyer Null img objet qui provoque une java.lang.illegalargumentException !!!


J'ai créé octets en lisant une image JPEG en Java, puis passa ce tableau d'octet sur cette pièce de code. Tout a fonctionné bien. Dans l'API de Java est écrit: "Si aucun ImageReaderReader affirme pouvoir lire le flux, null est renvoyé." Je vous suggère de vérifier s'il y a un ImageReader S disponible et si votre tableau d'octet est vraiment une image JPEG.


Oh, je vois ma cécité. J'ai supposé que votre tableau BYTE contenait une JPEG. Au lieu de cela, ce sont des données de couleur brute. Désolé.



0
votes

bi.setrgb prend une valeur "int" 4 octets, qui est l'argb 0xaarrgGBB

Vous augmentez ensuite votre compteur de décalage d'octets par un, le prochain pixel obtiendra 0xrggbbaa, puis 0xggbbaarr etc.

supposer que l'octet [] que vous passez est dans le format 4 octets correct, vous devez soit ajouter 4 à "Compter" à chaque fois, soit modifier ce que vous passez à un int [] (ce qui serait plus correct , comme il contient vraiment des valeurs int).


0 commentaires

0
votes

Bonjour, je faisais face au même problème, je définissais la largeur et les valeurs de hauteur en tant que codes creusés, disons (300 300) provoquant une sortie similaire. Ensuite, j'ai référencé ce lien. Byte brut [] à JPEG Image Vous pouvez ignorer la partie bitmap dans ce. Je suppose que vous êtes également en train de tirer la largeur et des valeurs de hauteur.


0 commentaires

0
votes

Vous pouvez essayer de remplacer vos boucles pour les boucles par ce xxx

choses qui risquent de mal tourner avec votre code:

  1. Vous écrivez habituellement la ligne par ligne non rangée par ligne

  2. Vous devez lire 3 octets et construire un int au lieu d'écrire les octets directement dans votre pixel (type_int_argb)

    Ce lien explique type_int_argb: format de type_int_rgb et type_int_argb

    J'espère que cela aide un peu et n'est pas trop confus =)


0 commentaires