我想将图像转换为字节数组并实现相反的操作。在这里,用户将输入图像的名称(.jpg
),程序将从文件中读取它并将其转换为字节数组。
如果您使用的是JDK 7,则可以使用以下代码..
import java.nio.file.Files;
import java.io.File;
File fi = new File("myfile.jpg");
byte[] fileContent = Files.readAllBytes(fi.toPath())
BufferedImage由两个主要类组成:Raster和ColorModel。Raster本身由两个类组成,DataBufferByte用于图像内容,另一个用于像素颜色。
如果你想从DataBufferByte中获取数据,请使用:
public byte[] extractBytes (String ImageName) throws IOException {
// open image
File imgPath = new File(ImageName);
BufferedImage bufferedImage = ImageIO.read(imgPath);
// get DataBufferBytes from Raster
WritableRaster raster = bufferedImage .getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
return ( data.getData() );
}
现在你可以通过隐藏文本在最低有效位(LSB)中来处理这些字节,或者按你想要的方式进行处理。
Files#readAllBytes()
或任何其他在任意文件上通常使用的合理方法即可。 - BalusCFile fnew=new File("/tmp/rose.jpg");
BufferedImage originalImage=ImageIO.read(fnew);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpg", baos );
byte[] imageInByte=baos.toByteArray();
BufferedImage image = ImageIO.read(new File("filename.jpg"));
// Process image
ImageIO.write(image, "jpg", new File("output.jpg"));
BufferedImage
和Base64
类来完成。同时需要正确设置一些参数。public class SimpleConvertImage {
public static void main(String[] args) throws IOException{
String dirName="C:\\";
ByteArrayOutputStream baos=new ByteArrayOutputStream(1000);
BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg"));
ImageIO.write(img, "jpg", baos);
baos.flush();
String base64String=Base64.encode(baos.toByteArray());
baos.close();
byte[] bytearray = Base64.decode(base64String);
BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray));
ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg"));
}
}
查看 javax.imageio
,特别是 ImageReader
和 ImageWriter
,它们是用于读写图像文件的抽象。
BufferedImage.getRGB(int x, int y)
可以获取给定像素的 RGB 值,这些值可以分块成字节。
注意:我认为您不希望读取原始字节,因为这样就必须处理所有压缩/解压缩问题。
RandomAccessFile
将会非常简单和方便。RandomAccessFile f = new RandomAccessFile(filepath, "r");
byte[] bytes = new byte[(int) f.length()];
f.read(bytes);
f.close();
你要找的是java.io.FileInputStream :-)
我认为最好的方法是先将文件读入字节数组,然后使用ImageIO.read()将数组转换为图像