簡體   English   中英

原始數據為JPEG格式 - JAVA

[英]Raw data to JPEG format - JAVA

我試圖使用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它應該是我的照片順便說一句:)

為什么不在ImageIO使用ByteArrayInputStream

您可以在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
    }
}

bi.setRGB采用4字節“int”值,即ARGB 0xAARRGGBB

然后,將字節偏移計數器遞增1,這樣下一個像素將獲得0xRRGGBBAA,然后是0xGGBBAARR,依此類推。

假設您傳遞的byte []是正確的4字節格式,您需要每次添加4到“count”,或者更改傳遞給int []的內容(這實際上更正確,因為它確實包含int值)。

嗨,我面臨同樣的問題,我設置寬度和高度值硬編碼讓我們說(300,300)導致類似的輸出。 然后我引用了這個鏈接。 原始byte []到jpeg圖像可以忽略其中的位圖部分。 我假設你也在硬編碼寬度和高度值。

您可以嘗試用此替換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. 您需要讀取3個字節並構建一個int而不是直接在Pixel(TYPE_INT_ARGB)中寫入字節

此鏈接說明TYPE_INT_ARGB:TYPE_INT_RGB和TYPE_INT_ARGB的格式

我希望這有點幫助,而不是太混亂=)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM