试图在photo-java swing上累积照片滤镜的效果

时间:2016-04-20 02:19:23

标签: java swing jslider changelistener

基本上我已经创建了一个显示图片的界面,它有多个JSliders。每个都有不同的功能,如模糊,变亮和饱和。我已经实现了滑块,我在添加新滑块时覆盖了stateChanged方法。当我单独执行滑块时,这可以正常工作,但是一旦我使用不同的滑块,它会变回原始图片。我想这样做,以便图片在照片上积累过滤器。有什么建议?这是我的一个滑块的示例。

brightSlider.addChangeListener(new ChangeListener() {

        @Override
        public void stateChanged(ChangeEvent e) {

            JSlider source = (JSlider) e.getSource();
            double scaleValue = source.getValue() / 100.0;
            Picture newPic = new PictureImpl(picture.getWidth(), picture.getHeight());
            //Picture newPic = picture;
            Pixel zeroPixel = new ColorPixel(0, 0, 0);
            Pixel p;
            for (int i = 0; i < picture.getWidth(); i++) {
                for (int j = 0; j < picture.getHeight(); j++) {
                    newPic.setPixel(i, j, zeroPixel);
                }
            }
            for (int i = 0; i < picture.getWidth(); i++) {
                for (int j = 0; j < picture.getHeight(); j++) {
                    if (scaleValue > 0) {
                        p = picture.getPixel(i, j).lighten(scaleValue);
                        newPic.setPixel(i, j, p);
                    } else if (scaleValue < 0) {
                        p = picture.getPixel(i, j).darken(scaleValue);
                        newPic.setPixel(i, j, p);
                    }
                }
            }
            setPic(newPic);
            picture_view.setPicture(newPic.createObservable());
        }
    }); 

1 个答案:

答案 0 :(得分:1)

Image processing with Java 2D所示,您可以创建一个Map<String, BufferedImageOp>来保存BufferedImageOp界面的具体实例。

Map<String, BufferedImageOp> ops = new TreeMap<String, BufferedImageOp>();
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
ops.put("Gray", new ColorConvertOp(cs, null));
…

Map密钥集添加到JComboBox

final JComboBox opBox = new JComboBox();
for (String key : ops.keySet()) {
    opBox.addItem(key);
}

在组合的处理程序中,在目标filter()上调用图像操作的BufferedImage方法。

String key = (String) opBox.getSelectedItem();
BufferedImageOp op = ops.get(key);
bufferedImage = op.filter(bufferedImage, null);

下图显示&#34;阈值64&#34;其次是&#34; Invert&#34;。 ImageDicer是一个完整的例子。

image