Странное поведение Java AffineTransformOp - PullRequest
0 голосов
/ 22 сентября 2018

Я могу правильно использовать AffineTransformOp.filter для изображений в формате png / jpeg.Но когда я наследую AffineTransformOp, он создает исключение!Следующий минимальный пример показывает это:

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.imageio.*;
import java.io.*;

public class Strange  extends JPanel {


  public static void main(String args[]) throws Exception {
      BufferedImage from = (BufferedImage) ImageIO.read(new File(args[0]));
      MyTrans at = new MyTrans();
      AffineTransformOp at2 = new AffineTransformOp(new AffineTransform(), AffineTransformOp.TYPE_BILINEAR);
      System.err.println("Bad = "+at.getTransform());
      System.err.println("Good = "+at2.getTransform());
      BufferedImage bi1 = at.filter(from,null);//1
      BufferedImage bi2 = at2.filter(from,null);//2
  }
}

class MyTrans extends AffineTransformOp {

    public MyTrans() {
        super(new AffineTransform(), TYPE_BILINEAR);
    }

}

Строка, отмеченная 1, выбрасывает ImagingOpException:Unable to transform src image.Но я закомментирую эту строку, затем следующая строка (которая делает то же самое) проходит гладко.Преобразование здесь - просто преобразование идентичности.Я использую Java 8 на Ubuntu 16.04.Это вызывает любое изображение в формате png или jpeg, поэтому я не прикрепляю изображение.

1 Ответ

0 голосов
/ 22 сентября 2018

AffineTransformOp.filter (src, dst) внутренне вызывает ImagingLib.filter (this, src, dst) из пакета sun.awt.image.ImagingLib, в строке 284.

 ...
   if (ImagingLib.filter(this, src, dst) == null) {
        throw new ImagingOpException ("Unable to transform src image");
    }
 ...

Поведение, которым мы являемсянаблюдение связано с реализацией ImagingLib.filter ().Этот метод проверяет, соответствует ли первый параметр любому из этих классов:

  • LookupOp
  • AffineTransformOp
  • ConvolveOp

When ImagingLib.Фильтр вызывается первым параметром, переданным в функцию, является this .В примере кода вы написали: at.class равно «MyTrans», а at2.class равно «AffineTransformOp».

Посмотрите накод ниже, он принадлежит ImagingLib.filter () исходный код.

 public static BufferedImage filter(BufferedImageOp var0, BufferedImage var1, BufferedImage var2) {

  ...
        BufferedImage var3 = null;
        switch(getNativeOpIndex(var0.getClass())) {
        case 0:
            LookupTable var4 = ((LookupOp)var0).getTable();
            if (var4.getOffset() != 0) {
                return null;
            }

            if (var4 instanceof ByteLookupTable) {
                ByteLookupTable var9 = (ByteLookupTable)var4;
                if (lookupByteBI(var1, var2, var9.getTable()) > 0) {
                    var3 = var2;
                }
            }
            break;
        case 1:
            AffineTransformOp var5 = (AffineTransformOp)var0;
            double[] var6 = new double[6];
            AffineTransform var7 = var5.getTransform();
            var5.getTransform().getMatrix(var6);
            if (transformBI(var1, var2, var6, var5.getInterpolationType()) > 0) {
                var3 = var2;
            }
            break;
        case 2:
            ConvolveOp var8 = (ConvolveOp)var0;
            if (convolveBI(var1, var2, var8.getKernel(), var8.getEdgeCondition()) > 0) {
                var3 = var2;
            }
        }

        if (var3 != null) {
            SunWritableRaster.markDirty(var3);
        }

        return var3;
    }
}

Итак, когда getNativeOpIndex (var0.getClass ()) вызывается, потому что«MyTrans» не является ожидаемым типом класса, он возвращает -1, поэтому он не обрабатывает ни одного регистра переключателя, и возвращается null .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...