1

私は Play!Framework 1.x を使用しています。その便利なツールの 1 つは classImagesで、その場で Image のサイズを変更できます。

からのコードは次のImages.resizeとおりです。

/**
 * Resize an image
 * @param originalImage The image file
 * @param to The destination file
 * @param w The new width (or -1 to proportionally resize) or the maxWidth if keepRatio is true
 * @param h The new height (or -1 to proportionally resize) or the maxHeight if keepRatio is true
 * @param keepRatio : if true, resize will keep the original image ratio and use w and h as max dimensions
 */
public static void resize(File originalImage, File to, int w, int h, boolean keepRatio) {
try {
    BufferedImage source = ImageIO.read(originalImage);
    int owidth = source.getWidth();
    int oheight = source.getHeight();
    double ratio = (double) owidth / oheight;

    int maxWidth = w;
    int maxHeight = h;

    if (w < 0 && h < 0) {
        w = owidth;
        h = oheight;
    }
    if (w < 0 && h > 0) {
        w = (int) (h * ratio);
    }
    if (w > 0 && h < 0) {
        h = (int) (w / ratio);
    }

    if(keepRatio) {
        h = (int) (w / ratio);
        if(h > maxHeight) {
            h = maxHeight;
            w = (int) (h * ratio);
        }
        if(w > maxWidth) {
            w = maxWidth;
            h = (int) (w / ratio);
        }
    }

    String mimeType = "image/jpeg";
    if (to.getName().endsWith(".png")) {
        mimeType = "image/png";
    }
    if (to.getName().endsWith(".gif")) {
        mimeType = "image/gif";
    }

    // out
    BufferedImage dest = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Image srcSized = source.getScaledInstance(w, h, Image.SCALE_SMOOTH);
    Graphics graphics = dest.getGraphics();
    graphics.setColor(Color.WHITE);
    graphics.fillRect(0, 0, w, h);
    graphics.drawImage(srcSized, 0, 0, null);
    ImageWriter writer = ImageIO.getImageWritersByMIMEType(mimeType).next();
    ImageWriteParam params = writer.getDefaultWriteParam();
    FileImageOutputStream toFs = new FileImageOutputStream(to);
    writer.setOutput(toFs);
    IIOImage image = new IIOImage(dest, null, null);
    writer.write(null, image, params);
    toFs.flush();
    toFs.close();
    writer.dispose();
} catch (Exception e) {
    throw new RuntimeException(e);
}

}

これが私がそれを使用する方法です:

File old = new File("1.jpg");
File n = new File("output.jpg");
Images.resize(old, n, 800, 800, true);

元の画像1.jpg: ここに画像の説明を入力

そしてoutput.jpgここに画像の説明を入力

ここで何が起こっているのか誰でも説明できますか? ありがとう !

4

2 に答える 2

0

私もこれを見たことがありますが、これは JRE のバグだと思います。getScaledInstanceを使用せず、代わりに描画中にスケーリングすることで回避しました。

于 2013-10-08T14:47:09.450 に答える
0

ああ。私は答えるのが遅すぎた。しかし、はい、それはおそらくバグです。自分でこの問題に遭遇しました。あなたはそれを回避する必要があります。Waldheinz が言ったように、画像をスケーリングしてみてください。私もそうでした。

これは私がスケーリングを行うために使用したリンクです: http://www.rgagnon.com/javadetails/java-0243.html、したがって、waldheinz's に加えてより多くの参照があります

于 2013-10-08T15:05:09.027 に答える