Создать файл изображения из необработанных строковых данных - PullRequest
0 голосов
/ 06 декабря 2018

например, у меня есть строка вроде этого:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAEd0lEQVR4Xu2c0ZLjIAwEk///6GzVvZlspWtWksNRnVcwiGmNwHaS5+v1ej38HKPAU6DHsPy3EIGexVOgh/EUqEBPU+Cw9biHCvQwBQ5bjg4V6GEKHLYcHSrQwxQ4bDk6VKCHKXDYcnSoQA9T4LDllB36fD5vlWR9fUvz0+ve9fp0/O7FU7w0n0CXhBSoDiXTRO06FBKKBLLkLvlGgkTp+UvndPzu/ul46Xq7x2/fQ8kR0wtOBaL+1J6uZ+3fPb5Aw0PRtxOWEkigAr3mCJUMuk9cM45uG3ZvJwel8dN4byW8+r1cgWYPVgRaLIlpwqWCT1cgHbr8skOgYUqkgtHwVYfQKZTiTW8rdCgQFWjtt2Pjty3TGdztOB0aHlosuVcHpglJ+h3nUFow7bE6dDOHCjRN2fBty917qEAF+jEHaI+bTlhK0Nsf/aUBpXtYdXy6noDS9dTePf74oYgWRO3dC6b57k6o7vUJFAh3Cz6dMAIV6FWB9FCQlry1f/ejQXLgt9eX6tXu0DSAtL9APysm0OYHI2mCUgVKxxOoQNOcubc/7XnF5yj3LuYPs5Ud+oc5Ry8R6GEpK1CBjlaMuwcvl1xyBC2I8im9T0xva6pPbtL1V+MjPQW6KEQJRAlAggs0vK2oCibQ4g9+LbnXb96THlQBvl5y0yclqYNQAKgAVGIJQHWPpfjf4uv+bUsagECvClCCkL46VIdecyQtKZRhlKGW3OG3LekeQ0DSBOk+1VLCdbdTAqfzlUuuQFPJe/fM9kORQAV6UYBKJslF11NJS0s8xZO2U3zpeO0lNw2g2+HV8dLbKJov1aMKWKDFfyITKKRsegqmjE7H06FpTRHoRwUoQUnu9pJLh4z0EFMdjwRI46ESWwVC8VK7QMN/TRHookDqCB1Knry261AdmmXMdG86xabzd49H83fP1+5QWkB3e7sg4eu06nra46++4K4uqHp9uyACrSKpXS/Q5kMRnUJruN6vnr7Po/VMn9KrepX3UBKgGmD1UVw6P61HoKmi0F+HfhZIhy766NDhU2F66CEgzQXjQRUjjb8aX7tDaYFpwKkgAi0SSAUXaO0Pjkk/HUoKFQ9p0wm/hjcONC2B6W3B24KKv1ZLx0vzgfQoFsyHQJe3LQINHUEZrUNre6wO1aHLw+AvO5QOHdReLbE0/vSeedyhKBWUDh00XpoAAg2/EkIAqD0FlPYXqEDp3Pix/b8/FKUOIMem7fR6j8Yr0fvlYoEWK4JAw0dplOE6dLnrqH5JrCp4NcMFejPQ6h7RnTAUT/eTKkpYiidtH99D04C6bwvS+QX65W8sUMkVaKgAlcRwuLfuNL5Ah/fQKkC6Pi2JKXB6NEjxUTslKF1P7e17KE1YbRfoZwUFuuijQ4v/l5s6VocOOzQFYv9ZBcoldzY8R08VEGiq2Ob9Bbo5oDQ8gaaKbd5foJsDSsMTaKrY5v0FujmgNDyBpopt3l+gmwNKwxNoqtjm/QW6OaA0PIGmim3eX6CbA0rDE2iq2Ob9Bbo5oDS8H8eCMw7yCzx+AAAAAElFTkSuQmCC

Я хочу преобразовать его обратно в файл изображения.вот что я попробовал:

public void dumpFromRawData(String rawData, String wheretoPut) throws Exception{
        byte[] imageByte = rawData.getBytes();
        BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageByte));

        File file = new File(wheretoPut);
        ImageIO.write(bufferedImage, "png", file);
    }

, где rawData - пример строки выше, а wheretoPut - новый каталог изображений .. например, D:\\image.png

, но когдая запускаю его, это дает мне это:

Exception in thread "main" java.lang.IllegalArgumentException: image == null!
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
    at javax.imageio.ImageIO.getWriter(ImageIO.java:1592)
    at javax.imageio.ImageIO.write(ImageIO.java:1520)

как я могу решить это?или это не правильный способ конвертировать его обратно в изображение?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

я наконец нашел решение.Спасибо @ Chris623 за то, что просветил меня: D

сначала мне нужно отделить 'заголовок' строкового файла .. строку data:image/png;base64,, а затем декодировать ее в byte[]

String separator = ",";    
String encoded = rawData.split(separator)[1];
byte[] decodedByte = Base64.getDecoder().decode(encoded.getBytes(StandardCharsets.UTF_8));

, а затем остальная часть процесса остается прежней .. полный метод выглядит следующим образом:

public void dumpFromRawData(String rawData, String wheretoPut, String fileName) throws Exception{
        String separator = ",";
        if(rawData.contains(separator)) {
            // use this when the decoded string contains "," separator, like data:image/png;base64,
            String encoded = rawData.split(separator)[1];
            byte[] decodedByte = Base64.getDecoder().decode(encoded.getBytes(StandardCharsets.UTF_8));

            // you can use this
//          Path destinationFile = Paths.get(wheretoPut, fileName);
//          Files.write(destinationFile, decodedByte);

            // or this
            BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(decodedByte));
            File file = new File(wheretoPut+fileName);
            ImageIO.write(bufferedImage, "png", file);

            System.out.println("File has been Written as " + wheretoPut + fileName);
        } else {
            System.out.println("i haven't think about it yet.");
        }
    }
0 голосов
/ 06 декабря 2018

Данные вашего изображения, кажется, закодированы в base64, поэтому вы не можете просто преобразовать эту строку в байтовый массив.Поэтому вы должны использовать что-то вроде:

byte[] imageByte = Base64.decode(rawData, Base64.DEFAULT);
...