我想把一个图像转换成字节数组,反之亦然。在这里,用户将输入图像的名称(.jpg) ,程序将 从文件里读出来并将其转换为字节数组。
.jpg
FileInputStream 是您要寻找的: -)
查看 javax.imageio,特别是 ImageReader和 ImageWriter,它们是读取和写入图像文件的抽象。
javax.imageio
ImageReader
ImageWriter
比 BufferedImage.getRGB(int x, int y)允许您获取给定像素上的 RGB 值,这些值可以分块为字节。
BufferedImage.getRGB(int x, int y)
注意: 我认为您不希望读取原始字节,因为那样就必须处理所有的压缩/解压缩。
我认为最好的方法是首先将文件读入一个字节数组,然后使用 ImageIO.read ()将该数组转换为一个图像
试试这个代码片段
BufferedImage image = ImageIO.read(new File("filename.jpg")); // Process image ImageIO.write(image, "jpg", new File("output.jpg"));
BufferedImage 由两个主要类组成: 光栅色彩模型。栅格本身由两个类组成,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 中隐藏文本来处理这些字节,或者按照您想要的方式来处理它。
File fnew=new File("/tmp/rose.jpg"); BufferedImage originalImage=ImageIO.read(fnew); ByteArrayOutputStream baos=new ByteArrayOutputStream(); ImageIO.write(originalImage, "jpg", baos ); byte[] imageInByte=baos.toByteArray();
如果您正在使用 JDK7,则可以使用以下代码。
import java.nio.file.Files; import java.io.File; File fi = new File("myfile.jpg"); byte[] fileContent = Files.readAllBytes(fi.toPath())
下面是完整的代码版本。我已经测试过了。BufferedImage和 Base64类主要起作用。还需要正确设置一些参数。
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")); } }
参考链接
使用 RandomAccessFile将是简单和方便的。
RandomAccessFile
RandomAccessFile f = new RandomAccessFile(filepath, "r"); byte[] bytes = new byte[(int) f.length()]; f.read(bytes); f.close();