Необработанные данные в формате JPEG — JAVA

Я попытался преобразовать необработанные данные ByteArray в формат JPEG с помощью JPEGEncoder, но он слишком медленный для мобильных устройств (я тестировал его на мобильных устройствах). Как я могу сделать то же самое в java? Я отправлю байт необработанных данных в java и закодирую его в JPEG с помощью java - я пробовал некоторые из них как JpegImageEncoder под com.sun. *, но он устарел в 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();
        }


    }

РЕЗУЛЬТАТ: введите здесь описание изображения

P.S. Кстати, это должно быть мое фото :)


person Zaur Guliyev    schedule 25.09.2012    source источник
comment
У меня точно такая же проблема. Вы нашли какое-нибудь решение?   -  person ehsun7b    schedule 30.10.2012
comment
Нет, пока я делаю все кодировки на стороне клиента, но обработка занимает много времени   -  person Zaur Guliyev    schedule 30.10.2012
comment
Для меня не имеет значения клиент или сервер, какой язык и технику вы сейчас используете?   -  person ehsun7b    schedule 30.10.2012
comment
Я использую Flex Mobile на стороне клиента и кодирую с помощью ActionScript. Я могу дать его вам, если он вам подходит (для меня это не лучшее решение, так как для кодирования ByteArray на мобильных устройствах требуется время)   -  person Zaur Guliyev    schedule 30.10.2012
comment
Не могли бы вы отправить его мне (пост на ehsunbehravesh dot com), это может дать мне некоторое представление.   -  person ehsun7b    schedule 30.10.2012
comment
Есть ли у jpeg альфа? A_RBG может быть проблемой.   -  person arynaq    schedule 16.03.2013


Ответы (4)


Почему бы не использовать ByteArrayInputStream с ImageIO?

Дополнительную информацию об ImageIO можно найти в API. .

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
    }
}
person r0estir0bbe    schedule 28.09.2012
comment
BufferedImage img = ImageIO.read (новый ByteArrayInputStream (resimBytes)); вернуть нулевой объект img, который вызывает java.lang.IllegalArgumentException !!! - person Zaur Guliyev; 15.10.2012
comment
Я создал bytes, прочитав изображение JPEG в Java, а затем передал этот массив байтов в этот фрагмент кода. Все работало нормально. В API Java написано: Если ни один зарегистрированный ImageReader не претендует на возможность чтения потока, возвращается null. Я предлагаю вам проверить, есть ли какие-либо доступные ImageReader и действительно ли ваш массив байтов является изображением JPEG. - person r0estir0bbe; 16.10.2012
comment
О, я вижу свою слепоту. Я предположил, что ваш массив byte содержит JPEG. Вместо этого это необработанные данные о цвете. Прости. - person r0estir0bbe; 16.10.2012

bi.setRGB принимает 4-байтовое значение "int", которое является ARGB 0xAARRGGBB

Затем вы увеличиваете свой счетчик смещения байтов на ОДИН, поэтому следующий пиксель получит 0xRRGGBBAA, затем 0xGGBBAARR и так далее.

Предполагая, что передаваемый вами byte[] имеет правильный 4-байтовый формат, вам нужно либо каждый раз добавлять 4 к «count», либо изменять то, что вы передаете, на int[] (что на самом деле было бы более правильным, поскольку это действительно содержит значения int).

person Wyzird42    schedule 16.03.2013

Привет, я столкнулся с той же проблемой, я устанавливал значения ширины и высоты как жестко закодированные, скажем, (300 300), вызывая аналогичный результат. тогда я сослался на эту ссылку. Необработанный байт[] в изображение jpeg вы можете игнорировать растровую часть в Это. Я предполагаю, что вы также жестко кодируете значения ширины и высоты.

person Swapnil    schedule 02.06.2014

Вы можете попробовать заменить свои циклы 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 байта и построить целое число вместо того, чтобы записывать байты непосредственно в ваш пиксель (TYPE_INT_ARGB)

Эта ссылка объясняет TYPE_INT_ARGB: формат TYPE_INT_RGB и TYPE_INT_ARGB

Я надеюсь, что это немного поможет и не слишком запутывает =)

person hackie    schedule 03.08.2014