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

2020年11月19日 23点热度 0条评论

放大图像时遇到问题。我有一个看起来像这样的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);

解决方案如下:

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

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

你可以简单地使用

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

基本上做同样的事情,但是我们用这个平滑的制作键将它放大。

我尝试了一下,发现它不太舒适,因为它滞后很多。

所以我只是在开始旋转图像时按比例放大它。

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