【问题标题】:Raw data to JPEG format - JAVAJPEG 格式的原始数据 - JAVA
【发布时间】:2012-09-16 13:39:43
【问题描述】:

我尝试使用 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 这应该是我的照片顺便说一句:)

【问题讨论】:

  • 我也有同样的问题。你找到解决办法了吗?
  • 不,目前我正在客户端进行所有编码,但处理时间很长
  • 对我来说不管是客户端还是服务器,你现在使用什么语言和技术?
  • 我在客户端使用 Flex Mobile,我正在使用 ActionScript 进行编码。如果它适合你,我可以给你(这对我来说不是最好的解决方案,因为它需要一段时间在移动设备上对 ByteArray 进行编码)
  • 你能不能把它发给我(在 ehsunbehravesh dot com 发帖)它可能会给我一些想法。

标签: java image apache-flex jpeg flex-mobile


【解决方案1】:

你可以尝试用这个替换你的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 的格式

我希望这会有所帮助,不要太混乱 =)

【讨论】:

    【解决方案2】:

    您好,我遇到了同样的问题,我将宽度和高度值设置为硬编码让我们说 (300,300) 导致类似的输出。然后我引用了这个链接。 Raw byte[] to jpeg image 你可以忽略其中的位图部分。我假设您也在硬编码宽度和高度值。

    【讨论】:

      【解决方案3】:

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

      然后,您将字节偏移计数器增加 1,因此下一个像素将获得 0xRRGGBBAA,然后是 0xGGBBAARR,依此类推。

      假设您传递的 byte[] 是正确的 4 字节格式,您需要每次将 4 添加到“count”,或者更改传递给 int[] 的内容(这实际上会更正确,因为它确实包含 int 值)。

      【讨论】:

        【解决方案4】:

        为什么不使用ByteArrayInputStreamImageIO

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

        【讨论】:

        • BufferedImage img = ImageIO.read(new ByteArrayInputStream(resimBytes));返回导致 java.lang.IllegalArgumentException 的空 img 对象!!!
        • 我通过读取 Java 中的 JPEG 图像创建了bytes,然后将该字节数组传递给这段代码。一切正常。在 Java 的 API 中写道:“如果没有注册的 ImageReader 声称能够读取流,则返回 null。”我建议您检查是否有可用的ImageReaders,以及您的字节数组是否真的是 JPEG 图像。
        • 哦,我看到了我的失明。我假设您的 byte 数组包含 JPEG。相反,它是原始颜色数据。对不起。
        猜你喜欢
        • 2011-07-18
        • 2018-05-04
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 2020-08-23
        相关资源
        最近更新 更多