sample29_7.java
来自「Java SE 6.0前27-31章示的示例代码,简单易学」· Java 代码 · 共 134 行
JAVA
134 行
package wyf.jc;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.image.*;
import java.awt.color.*;
import java.io.*;
public class Sample29_7 extends JFrame implements ChangeListener
{
//创建显示源图像的标签,并将其放置到滚动窗格中
JLabel jls=new JLabel();
JScrollPane jspz=new JScrollPane(jls);
//创建显示目标图像的标签,并将其放置到滚动窗格中
JLabel jlt=new JLabel();
JScrollPane jspy=new JScrollPane(jlt);
//创建分割窗格,并设置各子窗格中显示的控件
JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jspz,jspy);
//创建文件选择器
JFileChooser jfc=new JFileChooser("D:\\");
//创建表示通道的标签数组
JLabel[] jl={new JLabel("红色"),new JLabel("绿色"),new JLabel("蓝色")};
//创建3个用来控制各通道颜色分量的滑块
JSlider[] js={new JSlider(-255,255),new JSlider(-255,255),new JSlider(-255,255)};
//创建一个面板
JPanel jp=new JPanel();
//定义一个图标引用
ImageIcon ii;
//创建自定义的过滤器对象
MyColorFilter mcf=new MyColorFilter(js[0].getValue(),js[1].getValue(),js[2].getValue());
public Sample29_7()
{
//加载选择的图片到图标对象中
ii=this.chooserFile();
//将图片设置到源标签中
jls.setIcon(ii);
//设置两个标签的水平、垂直对齐方式
jls.setVerticalAlignment(JLabel.CENTER);
jls.setHorizontalAlignment(JLabel.CENTER);
jlt.setVerticalAlignment(JLabel.CENTER);
jlt.setHorizontalAlignment(JLabel.CENTER);
//将处理后的图片设置到目标标签中
jlt.setIcon(ii);
//设置分隔条的宽度以及初始位置
jsp.setDividerLocation(500);
jsp.setDividerSize(4);
//将分割窗格添加到窗体中
this.add(jsp,BorderLayout.CENTER);
//将标签以及滑块添加到面板中,并为滑块注册监听器
for(int i=0;i<js.length;i++)
{
jp.add(jl[i]);
jp.add(js[i]);
js[i].addChangeListener(this);
}
//将面板添加到窗体中
this.add(jp,BorderLayout.SOUTH);
//设置窗体的标题、大小位置以及可见性
this.setTitle("RGB色彩通道过滤");
this.setBounds(0,0,1000,500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//实现ChangeListener接口中的事件处理方法
public void stateChanged(ChangeEvent e)
{
//设置3个分量的值
mcf.setRGBValue(js[0].getValue(),js[1].getValue(),js[2].getValue());
//获取过滤后的图象
Image tempImg=createImage(new FilteredImageSource(ii.getImage().getSource(),mcf));
//将处理后的图象显示到目标标签中
jlt.setIcon(new ImageIcon(tempImg));
}
//加载选中图片的方法
public ImageIcon chooserFile()
{
//弹出文件选择器
int i=jfc.showOpenDialog(this);
//获取选择文件的路径
String dir=(jfc.getSelectedFile()!=null)?(jfc.getSelectedFile().getPath()):null;
if(dir!=null&&!dir.equals(""))
{
//按指定的路径加载图片到图标对象中并返回
return new ImageIcon(dir);
}
return null;
}
public static void main(String[] args)
{
//创建Sample29_7窗体对象
new Sample29_7();
}
}
//自定义的RGB色彩通道过滤器类
class MyColorFilter extends RGBImageFilter
{
//RGB色彩通道各自的调整值
int rc,gc,bc;
public MyColorFilter(int rc,int gc,int bc)
{//初始化各个色彩通道的调整值
this.rc=rc;this.bc=bc;this.gc=gc;
}
public void setRGBValue(int rc,int gc,int bc)
{//设置各个色彩通道的调整值
this.rc=rc;this.bc=bc;this.gc=gc;
}
public int filterRGB(int x, int y, int rgb)
{
//取出红色通道中的数值
int tempRed=(rgb&0x00ff0000)>>16;
//对红色通道值进行处理
tempRed+=rc;
//判断处理后的数值是否越位,若越位则进行处理
tempRed=(tempRed<255)?((tempRed>0)?tempRed:0):255;
//将处理后的值移回指定位
tempRed=tempRed<<16;
//取出绿色通道中的数值
int tempGreen=(rgb&0x0000ff00)>>8;
//对绿色通道值进行处理
tempGreen+=gc;
//判断处理后的数值是否越位,若越位则进行处理
tempGreen=(tempGreen<255)?((tempGreen>0)?tempGreen:0):255;
//将处理后的值移回指定位
tempGreen=tempGreen<<8;
//取出蓝色通道中的数值
int tempBlue=(rgb&0x000000ff);
//对蓝色通道值进行处理
tempBlue+=bc;
//判断处理后的数值是否越位,若越位则进行处理
tempBlue=(tempBlue<255)?((tempBlue>0)?tempBlue:0):255;
//将红绿蓝三色通道的值与颜色本身中高8位用来控制透明度的值进行按位或运算并返回
return (rgb&0xff000000)|tempRed|tempGreen|tempBlue;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?