18

データURIを使用して画像のサムネイルを送信するように言われました。私はそれを検索してきましたが、基本的にファイルのテキスト表現であり、HTMLで直接使用できることがわかりました。JavaでデータURIを作成する方法を実際に見つけることができませんでした。ファイルの入力ストリームがあります。誰かがそれに光を当てて、これを生成する方法を教えてもらえますか?

4

2 に答える 2

21

画像の例:

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

以下のコードを実行します。FF がデフォルトのブラウザである場合、次のように表示されます。

FF のデータ URI イメージ

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import java.util.Base64;

public class DataUriConverter {

    static String getImageAsString(BufferedImage image) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // serialize the image
        ImageIO.write(image, "png", baos);
        // convert the written image to a byte[]
        byte[] bytes = baos.toByteArray();
        System.out.println("bytes.length " + bytes.length);
        // THIS IS IT! Change the bytes to Base 64 Binary
        String data = Base64.getEncoder().encodeToString(bytes);
        // add the 'data URI prefix' before returning the image as string
        return "data:image/png;base64," + data;
    }

    static BufferedImage getImage() {
        int sz = 500;
        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(new Color(0,0,255,63));
        g.setStroke(new BasicStroke(1.5f));
        for (int ii = 0; ii < sz; ii += 5) {
            g.drawOval(ii, ii, sz - ii, sz - ii);
        }
        g.dispose();

        return image;
    }

    public static void main(String[] args) throws Exception {
        String imageString = getImageAsString(getImage());
        String htmlFrag = "<html><body><img src='%1s'></body></html>";
        String html = String.format(htmlFrag, imageString);

        // 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);
    }
}
于 2013-02-21T07:33:09.370 に答える