缩放的“直线”图像跳出线

问题描述 投票:0回答:1

a在放大图像时遇到问题。我有一个看起来像这样的png文件:raw png

图像为8px * 8px,上面有一些红色直线。但是,当我使用Java绘制此图像并将其按比例放大时,会发生这种情况:java image

而且您几乎可以看到,这条线并不完全是直线。它总是偏离一个像素,并形成这种波浪形。如果图像被绘制在框架的其他位置,则“波浪”位于其他位置。图像旋转了90°,但我没有旋转就对其进行了测试,它仍然在那里。除此之外,我还需要旋转图像。

有什么办法解决这个问题?我在同一Graphics2D对象中启用了文本抗锯齿功能。还为此进行了一些反义吗?

代码

private void loadImage(String path, int field, int imageNumber) {
    BufferedImage image;
    image = new Resource().readImg(path);
    images[field][imageNumber][0] = image;
    images[field][imageNumber][1] = rotateClockwise90(image);
    images[field][imageNumber][2] = rotateClockwise90(rotateClockwise90(image));
    images[field][imageNumber][3] = rotateClockwise90(rotateClockwise90(rotateClockwise90(image)));
}

private BufferedImage rotateClockwise90(BufferedImage src) {
    int width = src.getWidth();
    int height = src.getHeight();

    BufferedImage dest = new BufferedImage(height, width, src.getType());

    Graphics2D graphics2D = dest.createGraphics();
    graphics2D.translate((height - width) / 2, (height - width) / 2);
    graphics2D.rotate(Math.PI / 2, height / 2, width / 2);
    graphics2D.drawRenderedImage(src, null);

    return dest;
}

程序启动时,我将图像向所有四个方向旋转,因此程序运行时不必一遍又一遍地进行。

public BufferedImage getTile(int type, int part, int rotation) {
    return images[type][part][rotation];
}

然后我要做的就是调用此get方法并绘制图像:

g2d.drawImage(tiles.getShipTile(type, part, rotation), x, y, null);
java image rendering antialiasing
1个回答
0
投票

我实际上找到了一种避免这些怪异像素的方法,但是这种方法会使图像有些模糊。代替使用

g2d.drawImage(img, x, y, width, height, null);

您可以简单地使用

g2d.drawImage(img.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING), x, y, null);

基本上具有相同的作用,但是我们使用此平滑处理键将其按比例放大。

我尝试过这个,发现它不太舒适,因为它滞后很多。

所以当我也旋转图像时,我只是在开始时将其放大。

正如我说的那样,此方法有点模糊,但是如果没有其他方法可以避免此问题,则必须使用此方法。您几乎看不到模糊,所以这对我来说是一个选择。

© www.soinside.com 2019 - 2024. All rights reserved.