Листать изображение - PullRequest
       27

Листать изображение

2 голосов
/ 11 апреля 2011

Я создаю игру с плитками, где мне нужно переворачивать изображения. С кодом у меня это выдает эту ошибку:

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;
}

Может кто-нибудь объяснить мне, что мне нужно сделать по-другому или как я могу заставить его работать? Большое спасибо

Ответы [ 2 ]

3 голосов
/ 11 апреля 2011

Возможно для image.getWidth(null) и image.getHeight(null) вернуть -1, если они еще не известны. Обработка изображения может быть выполнена одновременно, и она может продолжаться, когда вы пытаетесь вызвать эти методы (даже локально это будет делать IIRC). Вот фрагмент кода, который я использовал прежде, чтобы дождаться загрузки изображения, прежде чем пытаться получить доступ к его ширине и высоте:

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 мс для некоторых маленьких изображений. На самом деле это не дополнительное время, оно просто заставляет ваш код ждать завершения последнего этапа, чтобы получить ширину и высоту.

0 голосов
/ 11 ноября 2013

Самый простой способ перевернуть изображение - отрицательное масштабирование. Пример:

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

Это перевернет его вертикально. Это перевернет его по горизонтали:

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