3

.tif 画像のサイズを変更し、それを base64 文字列に変換してブラウザに表示しようとしています。ImageIo はデフォルトで TIF イメージをサポートしていないため、imageio_alpha-1.1.jar を追加しました (ここで入手 - http://www.findjar.com/jar/geoserver/jai/jars/jai_imageio-1.1-alpha.jar. html )。これで ImageIO はプラグインを登録できるようになりました。

String[] writerNames = ImageIO.getWriterFormatNames();

writerNames には TIF が含まれています。これは、ImageIO がプラグインを登録したことを意味します。

私はこのように画像のサイズを変更しています

Map resizeImage(BufferedImage imageData, int width, int height, String imageFormat){

                BufferedImage thumbnail =  Scalr.resize(imageData, Scalr.Method.SPEED, Scalr.Mode.FIT_EXACT ,
                    width, height, Scalr.OP_ANTIALIAS);

                String[] writerNames = ImageIO.getWriterFormatNames();

                ByteArrayOutputStream baos = new ByteArrayOutputStream()
                ImageIO.write(thumbnail, imageFormat, baos)
                baos.flush()
                byte[] imageBytes = baos.toByteArray()
                baos.close()

                return [imageBytes:imageBytes, imageFormat:imageFormat]
            }

    String encodeImageToBase64(byte[] imageData){
                return Base64.encodeBase64String(imageData)
            }

BufferedImage getBufferedImage(byte[] imageData){
                ByteArrayInputStream bais = new ByteArrayInputStream(imageData)
                BufferedImage bImageFromConvert = ImageIO.read(bais)
                bais.close()
                return bImageFromConvert
            }

String resizeToDimensions(byte[] imageData, String imageFormat, int width, int height){
            def  bimg = getBufferedImage(imageData)
            Map resizedImageData = resizeImage(bimg, width, height, imageFormat)
            return encodeImageToBase64(resizedImageData.imageBytes)
        }

今、私はこれ < img src = "data:image/tif;base64,TU0AKgAAAAgADAEAAAMAAA...." />でこのような画像を表示していますが、base64文字列が通常/ 9j /で始まることがわかっている限り、(ホバリング時に) URLメッセージの読み込みに失敗しました(間違っている可能性があります)。/9j/ を追加するとき。「画像が破損しているか切り捨てられています」というエラーが表示されます。ここで問題がわかりません、助けてください。

4

1 に答える 1

1

一見すると、Data URI 形式の使用は正しいように見えます。失敗した場所を正確に絞り込んでみてください。

私がお勧めします:

  1. 文字列をフロントエンドに返すメソッドでは、すべてをコンソールに出力して、生データを Data URI 形式で取得することをお勧めします。
  2. データ URI 文字列を取得し、ハードコードされた値を含むサンプル HTML ファイルを作成し、それを読み込んでみます... 画像は表示されますか? もしそうなら、あなたの問題は、それをどのようにフロントエンドにストリーミングしているか、またはどのようにロードしようとしているかにあります. (おそらく JavaScript/DOM の問題)
  3. それがうまくいかない場合は、例から Base64 セクションを切り取って、例の TXT ファイルに保存してみてください。Java コードで、それをロードしてデコードし、そこから画像を作成して TIFF に書き戻します。それが機能しない場合は、Base64 の処理に問題があり、エンコーディングが無効です。最も可能性が高い。

そこまで行けば、ほとんどの質問に答えられるはずです。

実際に考えてみると、ImageIO を使用して画像を BufferedImage に読み込んでから imgscar で処理し、すぐに ImageIO.write を呼び出して別の場所にある新しい TIF に書き込んでみて、ImageIO のデコードを確認してください。 /encoding プロセスは正しく機能しています。

それが役立つことを願っています!

于 2012-12-27T18:12:06.833 に答える