如何在Java中导入和导出原始图像?

时间:2019-02-06 03:23:38

标签: java image

正如标题所示,我正在尝试读取和输出原始图像文件。我在该程序中的目标是读取原始图像并进行一些图像处理,然后输出最终图像。我有一个如何做这个程序的主意,但是我被困在尝试读取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 :(得分:2)

ImageIO支持GIF,JPEG,PNG,BMP和WBMP,但是您也可以在ImageIO support for raw images (jrawio)中找到一些RAW库(例如jrawio)

答案 1 :(得分:2)

int[] rgb = image.getRGB(0, 0, width, height, null, 0, width);

WritableRaster raster = image.getWritableRaster();

诚然,getRGB比较简单。上面我以 scan size 为宽度,有时是对齐的。 RGBA,ARGB和一个可能会有所不同。

这是一个线性的一维数组,可以使用IntBuffer,如果需要,甚至可以将字节顺序更改为little endian。

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)。