3

次のようにURLから画像をダウンロードしています。

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

次の16進文字列形式に変換したいと思います。

89504E470D0A1A0A0000000D4948445200000124000001150802000000C6BD0FB3000000017352474200AECE1CE9000000097048597300000EC400000EC401952B0E1B000050B849444154785EED7D0B745CD759EE09E5618742A5C6F1833CB01A6E630587565

しかし、私はそれを行う方法がわかりません。どうやってやるの?

4

4 に答える 4

3

次の組み合わせを行うことができます。

  1. 画像のバイト配列を取得します。Java-ディスクに書き込まずにbufferedimageをbyte[]に変換します
  2. バイト配列の16進文字列を取得する:Javaでバイト配列を16進文字列に変換する方法は?
于 2013-03-27T12:58:13.583 に答える
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);
}
于 2013-03-27T12:59:09.260 に答える
2

byte[]通常のJavaI/ Oの方法で画像をフレーバーで取得し、それをフィードしDataTypeConverter#printHexBinary()て16進文字列を取得します。

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());
// ...

ImageIOこれには、Java 2D API( et.al.)全体は必要ないことに注意してください。これは、実際に画像を操作する場合(サイズ変更、トリミング、スキューなど)にのみ役立ちます。

于 2013-03-27T13:10:36.217 に答える
0

他の回答に加えて、画像を読み取ったら、既存のjavax.xml.bind.DatatypeConverterクラスを使用して、バイト配列を16進文字列に変換することもできます。理想的には、@ BalusCのアプローチを使用してメモリを節約し、画像をバイト配列に直接読み込んでから、次のようにします。

String s = javax.xml.bind.DatatypeConverter.printHexBinary(byteArray);
于 2013-03-27T13:08:37.760 に答える