10

JPEGEncoder を使用して生データ ByteArray を JPEG 形式に変換しようとしましたが、モバイルでは遅すぎます (モバイルでテストしました)。Javaで同じことを行うにはどうすればよいですか? 生データ バイトを Java に送信し、Java で JPEG にエンコードします。com.sun.* の下で JpegImageEncoder としてそれらのいくつかを試しましたが、jdk7 では減価償却されています。Javaでこれを行うにはどうすればよいですか、またはそのようなことを行ったFlexモバイル開発者からの提案はありますか?

更新:次のコードを試しましたが、奇妙な結果が得られました:

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();
        }


    }

結果:ここに画像の説明を入力

PSそれはところで私の写真でなければなりません:)

4

4 に答える 4

2

ByteArrayInputStreamと一緒に使用しないのはなぜImageIOですか?

APIに ImageIO に関する詳細情報があります。

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
    }
}
于 2012-09-28T19:48:42.633 に答える
0

こんにちは、私は同じ問題に直面していました。幅と高さの値をハードコードされたように設定していました (300,300) と言って、同様の出力を引き起こします。次に、このリンクを参照しました。 Raw byte[] to jpeg imageその中のビットマップ部分は無視できます。幅と高さの値もハードコーディングしていると思います。

于 2014-06-02T12:39:20.503 に答える
0

これでforループを置き換えることができます

for(int w = 0; w < width; w++)
{
    for(int h = 0; h < height; h++)
    {
            //alpha should be eiter 0 or 255
            //if you use the wrong value your image will be transparent

            int alpha = 0 << 8*3;
            int red = rawBytes[count*3 + 0] << 8*2;
            int green = rawBytes[count*3 + 1] << 8*1;
            int blue = rawBytes[count*3 + 2] << 8*0;

            int color = alpha + red + green + blue;

            //color is an int with the format of TYPE_INT_ARGB (0xAARRGGBB)

            bi.setRGB(w, h, color);
            count += 3;
    }
}

コードで問題が発生した可能性があること:

  1. 通常、行ごとではなく行ごとに記述します

  2. Pixel (TYPE_INT_ARGB) にバイトを直接書き込むのではなく、3 バイトを読み取って int を作成する必要があります。

このリンクでは、TYPE_INT_ARGB について説明しています: TYPE_INT_RGB および TYPE_INT_ARGB のフォーマット

これが少し役に立ち、あまり混乱しないことを願っています =)

于 2014-08-03T00:23:16.363 に答える
0

bi.setRGBARGB 0xAARRGGBB である 4 バイトの「int」値を取ります

次に、バイト オフセット カウンターを 1 ずつインクリメントすると、次のピクセルは 0xRRGGBBAA、次に 0xGGBBAARR などになります。

渡す byte[] が正しい 4 バイト形式であると仮定すると、毎回 "count" に 4 を追加するか、渡すものを int[] に変更する必要があります (実際には、より正確です。実際には int 値が含まれています)。

于 2013-03-16T21:38:08.113 に答える