Java:将字符串写入JPG文件

俊邦影城

好吧,所以我正在编写一个小程序,应该花10分钟才能完成,但是我遇到了无法预料的问题。

该程序应接收我在旧手机上的Vault程序中拥有的一些旧文件,它们基本上是Jpg文件,但是在文件的开头添加了“模糊的”文本。

所以下面是我的代码逻辑

  1. 获取文件的文件夹输入,
  2. 创建一个包含每个实际文件的arraylist。
  3. 调用ConvertFiles将文件转换为字符串,
  4. 使用子字符串删除前8个字符,并将该临时文件保存到另一个包含字符串的arraylist中。
  5. 将该字符串解码为base64并将其输入到bytearrayinputstream中,并将其保存到缓冲图像中。

这是发生问题的地方。我一直到ImageIO.read(bis)都有内容,因此当它尝试写入新文件时,它会从ImageTypeSpecifier中抛出image == null。我尝试了多种解码和编码字符串的方法,但是需要任何帮助,如果需要更多信息,我会提供!

public class ImageConvert {

    private File folder;
    private ArrayList<File> files;
    private ArrayList<String> stringFiles = new ArrayList<>();
    private ArrayList<BufferedImage> bfImages = new ArrayList<>();
    boolean isRunning = true;
    Scanner scanner = new Scanner(System.in);
    String folderPath;

    public static void main(String[] args) {
        ImageConvert mc = new ImageConvert();
        mc.mainCode();
    }

    public void mainCode(){
        System.out.println("Please enter the folder path: ");
        folderPath = scanner.nextLine();
        folder = new File(folderPath);
        //System.out.println("folderpath: " + folder);
        files = new ArrayList<File>(Arrays.asList(folder.listFiles()));
        convertFiles();
    }

    public void convertFiles(){
        for(int i = 0; i < files.size(); i++){
            try {
                String temp = FileUtils.readFileToString(files.get(i));
                //System.out.println("String " + i + " : " + temp);
                stringFiles.add(temp.substring(8));
            } catch (IOException ex) {
                Logger.getLogger(ImageConvert.class.getName()).log(Level.SEVERE,
                                                                    null, ex);
            }
        }

        //System.out.println("Converted string 1: " + stringFiles.get(0));
        for(int j = 0; j < stringFiles.size(); j++){

            BufferedImage image = null;
            byte[] imageByte;

            try {
               BASE64Decoder decoder = new BASE64Decoder();
               imageByte = decoder.decodeBuffer(stringFiles.get(j));
               System.out.println(imageByte.toString());
               ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
               image = ImageIO.read(bis);
               bis.close();
               bfImages.add(image);
          } catch (IOException ex) {
               Logger.getLogger(ImageConvert.class.getName()).log(Level.SEVERE,
                                                                   null, ex);
          }

        }


        System.out.println("Image 1: " + bfImages.get(0));

        for(int k = 0; k < bfImages.size(); k++){
            try {
                ImageIO.write(bfImages.get(k), "jpg",
                              new File(folderPath + "/" + k + ".jpg"));
            } catch (IOException ex) {
                Logger.getLogger(ImageConvert.class.getName()).log(Level.SEVERE,
                                                                    null, ex);
            }
        }

    }

}

这是我的文件的一个示例:

乔尼·亨利

以下示例使用问题中包含的文件。您无需进行任何解码,只需将文件读入内存,存储8个字节String,然后将其余字节写入jpg8个字节的偏移量即可。

只需采用以下方法即可使用:“文件的文件夹输入”。您不需要ArrayList包含每个实际jpg文件。

public void convertFiles() {
    File imgFile;
    byte[] bytes;
    FileOutputStream fos;
    String temp;

    for (int i = 0; i < files.size(); i++) {
        temp = "";

        try {
            // 'read' method can be found below
            bytes = read(files.get(i));

            // read the 8 byte string from the beginning of the file
            for(int j = 0; j < 8; j++) {
                temp += (char) bytes[j];
            }

            imgFile = new File("img.jpg");

            // points to './img.jpg'
            fos = new FileOutputStream(imgFile);

            // write from offset 8 to end of 'bytes'
            fos.write(bytes, 8, bytes.length - 8);

            fos.close();
        } catch (FileNotFoundException e) {
            // Logger stuff
        } catch (IOException ex) {
            // Logger stuff
        }

        System.out.println("[temp]:> " + temp);
    }

}

read(File file)Java中从社区Wiki答案到文件到byte []的方法

public byte[] read(File file) throws IOException {
    ByteArrayOutputStream ous = null;
    InputStream ios = null;
    try {
        byte[] buffer = new byte[4096];
        ous = new ByteArrayOutputStream();
        ios = new FileInputStream(file);
        int read = 0;
        while ((read = ios.read(buffer)) != -1) {
            ous.write(buffer, 0, read);
        }
    } finally {
        try {
            if (ous != null)
                ous.close();
        } catch (IOException e) {
        }

        try {
            if (ios != null)
                ios.close();
        } catch (IOException e) {
        }
    }

    return ous.toByteArray();
}

输出:

[temp]:> obscured

图像文件:

解码的图像文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java:将字符串写入JPG文件

来自分类Dev

java将列表字符串写入csv文件

来自分类Dev

Java-将字符串写入CSV文件

来自分类Dev

java将列表字符串写入csv文件

来自分类Dev

将字符串写入文件

来自分类Dev

Android:将字符串写入文件

来自分类Dev

在Java中将字符串写入文件

来自分类Dev

将npgsqlexception字符串写入文件不写入

来自分类Dev

用Java将很小的字符串写入文件的最快方法是什么?

来自分类Dev

将字符串写入Java中的文本文件

来自分类Dev

用Java将很小的字符串写入文件的最快方法是什么?

来自分类Dev

如何将字符串中的PDF内容写入Java中的文件?

来自分类Dev

Java 如何将特定字符串逐行写入 Txt 文件(Tesseract 输出)

来自分类Dev

将字符串写入文件的pythonic方法是什么?

来自分类Dev

将几行字符串写入文件

来自分类Dev

将类实例的字符串表示形式写入文件

来自分类Dev

无法将大字符串写入文件

来自分类Dev

ksh将字符串拆分为数组以写入文件

来自分类Dev

将长字符串写入文件(节点js)

来自分类Dev

PHP fwrite()用于将大字符串写入文件

来自分类Dev

如何将字符串和数值写入文件

来自分类Dev

使用ZipOutputStream将字符串写入zip文件

来自分类Dev

使用ZipOutputStream将字符串写入zip文件

来自分类Dev

将包含XML的字符串写入文件

来自分类Dev

将字符串写入文件的pythonic方法是什么?

来自分类Dev

将ArrayList字符串写入文件时出错

来自分类Dev

尝试将字符串写入临时文件

来自分类Dev

使用类将字符串写入文件-空输出

来自分类Dev

如何将字符串写入文件?