Как импортировать и экспортировать необработанные изображения в Java? - PullRequest
0 голосов
/ 06 февраля 2019

Как следует из названия, я пытаюсь прочитать и вывести файл необработанного изображения.Моя цель в этой программе - прочитать необработанное изображение и выполнить некоторую обработку изображения, а затем вывести окончательное изображение.У меня есть идея, как сделать эту программу, но я застрял, пытаясь прочитать сырое изображение в Java.Я даже не уверен, как правильно загрузить необработанное изображение в папку моего проекта.Любой совет будет оценен.Вот мой код (если я взял этот код с веб-сайта для тестирования).

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Assignment_1 {

void importImageIGuess() {

}

public static void main(String[] args) throws IOException {
    int width = 512;
    int length = 512;
    BufferedImage image = null;
    File f = null;

    //Read File I guess
    try {
        f = new File("lena.raw");
        image = new BufferedImage(width, length, BufferedImage.TYPE_INT_ARGB);
        image = ImageIO.read(f);
        System.out.println("Reading completed");

    }
    catch(IOException e) {
        System.out.println("Error " +e);

    }
    try{
        f = new File("lenaOutput.raw");
        ImageIO.write(image, "raw", f);
        System.out.println("Writing completed I guess");


    } catch (IOException e ) {
        System.out.println("Error " + e);
    }

}

}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019
int[] rgb = image.getRGB(0, 0, width, height, null, 0, width);

или

WritableRaster raster = image.getWritableRaster();

По общему признанию getRGB проще.Выше я предполагал, что размер сканирования равен ширине, иногда он выравнивается.RGBA, ARGB и один могут различаться.

Это линеаризованный одномерный массив, можно использовать IntBuffer, даже изменить порядок байтов на младший, если это необходимо.

Path path = Paths.get("lena.raw");
byte[] content = Files.readAllBytes(path);
IntBuffer buf = ByteBuffer.wrap(content) /*.order(ByteOrder.LITTE_ENDIAN)*/ .asIntBuffer();
int[] rgb = new int[content.length / 4];
buf.get(rgb);
BufferedImage outImage = new BufferedImage(width, length, BufferedImage.TYPE_INT_ARGB);
outImage.setRGB(0, 0, width, height, rgb, 0, width);
ImageIO.write(outImage, "png", new FileOutputStream(...));

Также просмотрите файловый канал и MappedByteBuffer для увеличения скорости и использования памяти.

Вероятно, следует ожидать появления ложных цветов в первый раз (TYPE_INT_ARGB).

0 голосов
/ 06 февраля 2019

ImageIO поддерживает GIF, JPEG, PNG, BMP и WBMP, но вы также можете найти некоторые библиотеки для RAW (например, jrawio), как в Поддержка ImageIO для необработанных изображений (jrawio)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...