Data URI - how to create them in Java?

后端 未结 2 796
半阙折子戏
半阙折子戏 2020-12-17 14:29

I have just been told to send the thumbnail of an image using data URI. I have been searching it but all I found was that its basically a textual representation of a file an

相关标签:
2条回答
  • 2020-12-17 15:07

    E.G. for an image:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ImageIO.write(image, "png", baos);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String imageString = "data:image/png;base64," +
        DatatypeConverter.printBase64Binary(baos.toByteArray());
    

    Example

    Run the code below. If FF is the default browser, you might see something like this:

    Data URI image in FF

    import java.awt.*;
    import java.awt.image.BufferedImage;
    import javax.xml.bind.DatatypeConverter;
    import javax.imageio.ImageIO;
    import java.io.ByteArrayOutputStream;
    import java.io.*;
    
    public class DataUriConverter {
    
        public static void main(String[] args) throws Exception {
            int sz = 200;
            BufferedImage image = new BufferedImage(
                    sz, sz, BufferedImage.TYPE_INT_ARGB);
    
            // paint the image..
            Graphics2D g = image.createGraphics();
            g.setRenderingHint(
                    RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(Color.BLUE);
            for (int ii = 0; ii < sz; ii += 5) {
                g.drawOval(ii, ii, sz - ii, sz - ii);
            }
            g.dispose();
    
            // convert the image
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            System.out.println("baos.toByteArray() " + baos.toByteArray());
            System.out.println("baos.toByteArray().length " + baos.toByteArray().length);
            String data = DatatypeConverter.printBase64Binary(baos.toByteArray());
            String imageString = "data:image/png;base64," + data;
            String html =
                    "<html><body><img src='" + imageString + "'></body></html>";
    
            // write the HTML
            File f = new File("image.html");
            FileWriter fw = new FileWriter(f);
            fw.write(html);
            fw.flush();
            fw.close();
    
            // display the HTML
            Desktop.getDesktop().open(f);
        }
    }
    
    0 讨论(0)
  • 2020-12-17 15:26

    Here is my example.

    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    
    import javax.xml.bind.DatatypeConverter;
    
    public class ToDataURI {
    
        public static void main(String[] args) throws IOException {
    
            // source file
            File file = new File("movie.mp4");
    
            // check content type of the file
            String contentType = Files.probeContentType(file.toPath());
    
            // read data as byte[]
            byte[] data = Files.readAllBytes(file.toPath());
    
            // convert byte[] to base64(java7)
            String base64str = DatatypeConverter.printBase64Binary(data);
    
            // convert byte[] to base64(java8)
            // String base64str = Base64.getEncoder().encodeToString(data);
    
            // cretate "data URI"
            StringBuilder sb = new StringBuilder();
            sb.append("data:");
            sb.append(contentType);
            sb.append(";base64,");
            sb.append(base64str);
    
            System.out.println(sb.toString());
    
        }
    }
    

    Processing flow

    1. Check file contentType
    2. Read file data into byte[]
    3. Convert byte[] data to base64
    4. Create "data URI" format

    You can get like

    data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21p....
    
    0 讨论(0)
提交回复
热议问题