【问题标题】:Flipping an image翻转图像
【发布时间】:2011-08-02 16:32:49
【问题描述】:

我正在创建一个需要翻转图像的瓷砖游戏。使用我拥有的代码会产生此错误:

Exception in thread "main" java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0

从这一行开始:

Image newImage = gc.createCompatibleImage(
        image.getWidth(null),
        image.getHeight(null),
        Transparency.BITMASK);

这是我的编码:

public Image getMirrorImage(Image image) {
    return getScaledImage(image, -1, 1);
}

private Image getScaledImage(Image image, float x, float y) {
    // set up the transform
    AffineTransform transform = new AffineTransform();
    transform.scale(x, y);
    transform.translate(
        (x-1) * image.getWidth(null) / 2,
        (y-1) * image.getHeight(null) / 2);

    // create a transparent (not translucent) image
    Image newImage = gc.createCompatibleImage(
        image.getWidth(null),
        image.getHeight(null),
        Transparency.BITMASK);

    // draw the transformed image
    Graphics2D g = (Graphics2D)newImage.getGraphics();
    g.drawImage(image, transform, null);
    g.dispose();

    return newImage;
}

谁能向我解释我可能需要做哪些不同的事情或如何让它发挥作用?非常感谢

【问题讨论】:

  • 尝试将比例乘以 -1 而不是设置为 -1。
  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java image graphics transform flip


【解决方案1】:

翻转图像的最简单方法是对图像进行负缩放。示例:

g2.drawImage(image, x, y, -width, height, null);

这将垂直翻转它。这将水平翻转它:

g2.drawImage(image, x, y, width, -height, null);

【讨论】:

    【解决方案2】:

    如果 image.getWidth(null)image.getHeight(null) 尚不知道,它们可能会返回 -1。图像处理可以同时完成,并且当您尝试调用这些方法时它可能仍在进行(即使在本地它也会执行此 IIRC)。这是我之前使用的一段 sn-p 代码,用于在尝试访问图像的宽度和高度之前等待图像被加载:

    private void waitForImage(Image image) {
        Container container = new Container();
        MediaTracker tracker = new MediaTracker(container);
        tracker.addImage(image, 0);
        try {
            tracker.waitForID(0, 1000);
        } catch (Exception e) {
        }
    }
    

    我刚刚尝试了本地测试,对于一些小图像,等待时间通常为 1 毫秒。这实际上并没有额外的时间,它只是迫使您的代码等待最后一个阶段完成以获取宽度和高度。

    【讨论】:

    • 要么使用,要么使用 ImageIO.read(File/URL/InputStream) 在加载之前阻塞。
    • 感谢您的帖子,您能否举例说明如何将其合并到我的程序中,以免出现错误?
    • @Andrew:哦,是的,没错,有一种更现代的方法可以做到这一点。我想起了十年前我在一个小程序中做的一些图像缩放,所以出于某种原因我首先引用了它:)
    • @mimis40 "你能举个例子吗.." 我会在你发布 SSCCE 的那一刻考虑到这一点。 对于图像,请随意使用(很多-链接到)image listed on my media page
    • @mimis40:看起来你只需要调用我在你的getScaledImage()方法开头发布的waitForImage()代码。
    猜你喜欢
    • 2012-01-14
    • 2013-07-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2011-10-02
    • 2019-01-26
    相关资源
    最近更新 更多