基本上我已经创建了一个显示图片的界面,它有多个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());
}
});
答案 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
是一个完整的例子。