О классе Java ByteArrayOutputStream - PullRequest
1 голос
/ 21 ноября 2010
BufferedImage bufferedImage = ImageIO.read(new File("/...icon.jpg"));

// this writes the bufferedImage into a byte array called resultingBytes
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

ImageIO.write(bufferedImage, "jpg", byteArrayOut);

byte[] resultingBytes = byteArrayOut.toByteArray();

Я использую приведенный выше код для получения изображения JEPG в виде байтового массива.Я хочу знать, что именно находится в этом байтовом массиве.Содержит ли этот массив какую-либо информацию заголовка файла или только значения пикселей?И, например, если я хочу изменить цвет этого изображения, какой хороший способ сделать это?Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

Это полный файл JPEG в памяти.

РЕДАКТИРОВАТЬ: Если вы хотите манипулировать данными пикселей в виде массива, вы можете найти Raster более полезным:

Например:

Raster raster = bufferedImage.getData();

Затем можно вызвать один из методов Raster.getPixels.

1 голос
/ 21 ноября 2010

Вот как вы читаете реальные значения пикселей.С информацией JPEG гораздо сложнее что-либо сделать!

public static void main(String... args) throws IOException {
    String u = "http://blog.stackoverflow.com/wp-content/uploads/stackoverflow-logo-300.png";

    BufferedImage old = ImageIO.read(new URL(u));
    BufferedImage inverted = new BufferedImage(old.getWidth(),
                                               old.getHeight(),
                                               BufferedImage.TYPE_INT_RGB);


    for (int y = 0; y < old.getHeight(); y++) {
        for (int x = 0; x < old.getWidth(); x++) {
            Color oldColor = new Color(old.getRGB(x, y));

            // reverse all but the alpha channel
            Color invertedColor = new Color(255 - oldColor.getRed(),
                                            255 - oldColor.getGreen(),
                                            255 - oldColor.getBlue());

            inverted.setRGB(x, y, invertedColor.getRGB());
        }
    }

    ImageIO.write(inverted, "png", new File("test.png"));
}
0 голосов
/ 21 ноября 2010

ByteArrayOutputStream содержит все, что вы ему написали.Ни больше ни меньше.Итак, ваш вопрос действительно относительно ImageIO.write ().Который записывает кодировку изображения в соответствии с типом кодировки, который вы предоставляете.Какой был JPEG.

...