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