BufferedImageOps: создание совместимых выходов RGBA? - PullRequest
2 голосов
/ 07 марта 2011

Немного более длинный фрагмент кода для этого:

public LookupOp maketable(Color target) {
short[] red = new short[256];
short[] green = new short[256];
short[] blue = new short[256];
short[] alpha = new short[256];
for (int i = 0; i < 256; i++) {
    alpha[i] = (short) i;
    red[i] = (short) ((double) target.getRed() * i / 256);
    green[i] = (short) ((double) target.getGreen() * i / 256);
    blue[i] = (short) ((double) target.getBlue() * i / 256);
}
short[][] data = { red, green, blue };
LookupTable lookupTable = new ShortLookupTable(0, data);
return new LookupOp(lookupTable, null);
}

public class GameArea extends JPanel {
public Color colour = new Color(0,0,0);
BufferedImage image = null;
BufferedImage outimage = null;
AffineTransform trans = new AffineTransform();
ColorConvertOp conv = null;

public GameArea() {
    setPreferredSize(new Dimension(600, 600));
    setBackground(new Color(0, 0, 5));
    try {
    image = ImageIO.read(new File("transTest.png"));
    } catch (Exception e) {
    e.printStackTrace();
    }
}

@Override
public void paintComponent(Graphics g) {
    try {
    BufferedImageOp filter = maketable(colour);
    outimage = filter.createCompatibleDestImage(image, ColorModel.getRGBdefault());
    filter.filter(image, outimage);
    trans.setToScale((double) getWidth() / (double) image.getWidth(),
        (double) getHeight() / (double) image.getHeight());

    ((Graphics2D) g).drawRenderedImage(outimage, trans);
    } catch (Exception e) {
    e.printStackTrace();
    }
}

}

class Refresher extends Thread {
//refreshes thread and changes the colour in the gamearea to make a fade between filters    
}

Я делаю несколько тестов в рамках подготовки к более широкой теме и знакомлюсь с изображениями, цветами и фильтрами.

Приведенный выше пример берет простое изображение и затемняет его с помощью различных расцветок, масштабируя его так, чтобы оно соответствовало размеру окна. Он работал для некоторых файлов после того, как я вынул альфа-канал в LookupOp (при использовании jpgs), но для других я получаю следующее исключение:

java.lang.IllegalArgumentException: Number of channels in the src (4) does not match number of channels in the destination (2)
    at java.awt.image.LookupOp.filter(Unknown Source)
    at java.awt.image.LookupOp.filter(Unknown Source)
    at objects.MainWindow$GameArea.paintComponent(MainWindow.java:72)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)

Я подозреваю, что проблема заключается в том, что количество каналов в исходном изображении не совместимо с моей таблицей поиска (которую я хочу использовать в качестве стандартной 32-битной системы RGBA). цветовая модель dest соответствует исходной цветовой модели, но это не работает для PNG, с которым я тестирую (прозрачность важна для моего проекта)

Как обычно работают с разными моделями цветов изображения? Есть ли разумный способ конвертировать изображение в совместимую модель RGBA?

edit: я могу решить эту проблему для .png, добавив альфа-канал обратно в таблицу make (то есть на 4 канала. Однако, это снова разбивает его для jpgs. Как определить количество (и тип) каналов в цветовой модели?

K.Barad

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