如何将图像从URL转换为十六进制字符串?

时间:2013-03-27 12:50:40

标签: java image hex

我正在从URL下载图片,如下所示:

BufferedImage image = null;
URL url = new URL("http://www.ex.com/image/pic.jpg");
image = ImageIO.read(url);

我想将其转换为类似以下十六进制字符串格式:

  

89504E470D0A1A0A0000000D4948445200000124000001150802000000C6BD0FB3000000017352474200AECE1CE9000000097048597300000EC400000EC401952B0E1B000050B849444154785EED7D0B745CD759EE09E5618742A5C6F1833CB01A6E630587565E2154EE0D579203756DE823764B1ACAEB5A70EBAB2C08588EDB

但我不知道该怎么做。我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

您可以执行以下操作的组合:

  1. 获取图像的字节数组:Java- Convert bufferedimage to byte[] without writing to disk
  2. 获取字节数组的十六进制字符串:How to convert a byte array to a hex string in Java?

答案 1 :(得分:3)

将图像读入字节数组:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( image, "jpg", baos );
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();

并将其显示为字符串:

public static String bytesToHex(byte[] bytes) {
    final char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for ( int j = 0; j < bytes.length; j++ ) {
        v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

答案 2 :(得分:2)

只需以byte[]方式获取图像,然后使用通常的Java I / O方式,然后将其反馈给DataTypeConverter#printHexBinary()以获取其中的十六进制字符串。

ByteArrayOutputStream output = new ByteArrayOutputStream();

try (InputStream input = new URL("http://example.com/some.jpg").openStream()) {
    byte[] buffer = new byte[10240];
    for (int length = 0; (length = input.read(buffer)) > 0;) {
         output.write(buffer, 0, length);
    }
}

String hex = DatatypeConverter.printHexBinary(output.toByteArray());
// ...

请注意,您不需要整个Java 2D API(ImageIO et.al。)。这仅在实际打算操纵图像(调整大小,裁剪,倾斜等)时才有用。

答案 3 :(得分:0)

除了其他答案之外,一旦您阅读了图像,您还可以使用现有的javax.xml.bind.DatatypeConverter类将字节数组转换为十六进制字符串。理想情况下使用@BalusC中的方法来节省内存并直接将图像读入字节数组,然后简单地执行

String s = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);