前言:
我们来介绍一下Java语言中的一个基础项目:图像处理工具。
接下来,我们对此进行编程:
package shj26122;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
public class PixelUi {
public void initUi(){
JFrame jf=new JFrame();
jf.setSize(900,900);
jf.setTitle("图像处理1.0");
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(3);
JPanel centerPanel=new JPanel();
jf.add(centerPanel,BorderLayout.CENTER);
JPanel northPanel=new JPanel();
northPanel.setBackground(Color.BLACK);
northPanel.setPreferredSize(new Dimension(0,40));
jf.add(northPanel,BorderLayout.NORTH);
PixelListener listener=new PixelListener(centerPanel);
String[] name={"打开","原图","马赛克","旋转","灰度","镜面翻转","缩放","复古","保存"};
for(int i=0;i<name.length;i++){
JButton jbu=new JButton(name[i]);
northPanel.add(jbu);
jbu.addActionListener(listener);
}
centerPanel.addMouseWheelListener(listener);
jf.setVisible(true);
Graphics g=centerPanel.getGraphics();
listener.setG(g);
}
public static void main(String[] args){
PixelUi ui=new PixelUi();
ui.initUi();
}
}
首先,我们需要导入所需要的swing和awt包,用于创建图形用户界面组件和处理图形操作,然后我们需要定义一个名为PixelUi的公共类,然后再进行对用户界面的创建,接下来我们还需要设置一些按钮以及我们需要为这些按钮设置监听器,最后我们需要定义main方法作为程序的入口,然后我们需要定义一个实例ui以及调用ui中的initUi方法,启动用户界面。
接下来我们展示第二个公共类:
package shj26122;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.io.File;
import java.io.IOException;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
public class PixelListener implements ActionListener,MouseWheelListener {
private Graphics g;
private FilterImage filter;
private int[][] PixelArr;
private String name;
private JPanel centerPanel;
public PixelListener(JPanel centerPanel) {
this.centerPanel=centerPanel;
String path="D:\\图片\\【哲风壁纸】下雪-冬季雪景(2).png";
PixelArr=getPixel(new File(path));
}
public void setG(Graphics g){
this.g=g;
filter=new FilterImage(g);
}
public void actionPerformed(ActionEvent e) {
name=e.getActionCommand();
System.out.println("点击按钮!");
switch(name){
case"原图":
filter.drawPixel1(PixelArr);
break;
case"马赛克":
filter.mosaic(PixelArr);
break;
case"旋转":
PixelArr=filter.rotate(PixelArr);
filter.drawPixel(PixelArr);
break;
case"灰度":
filter.grey(PixelArr);
break;
case"打开":
JFileChooser jfc=new JFileChooser();
FileNameExtensionFilter filter=new FileNameExtensionFilter("图片文件","jpg","png","bmp");
jfc.setFileFilter(filter);
jfc.showOpenDialog(null);
File file=jfc.getSelectedFile();
PixelArr=getPixel(file);
break;
}
}
public void mouseWheelMoved(MouseWheelEvent e){
int rotate=e.getWheelRotation();
if("缩放".equals(name)){
if(rotate>0){
filter.setPixelSize(filter.getPixelSize()-20);
}else{
filter.setPixelSize(filter.getPixelSize()+20);
}
filter.filterImage(PixelArr);
}
}
public int[][] getPixel(File file){
BufferedImage bufferedImage = null;
try{
bufferedImage = ImageIO.read(file);
}catch(IOException e){
throw new RuntimeException(e);
}
int h=bufferedImage.getHeight();
int w=bufferedImage.getWidth();
int[][] PixelArr=new int[h][w];
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
int Pixel=bufferedImage.getRGB(j,i);
PixelArr[i][j]=Pixel;
}
}
return PixelArr;
}
}
与上面一样,我们首先需要导入所需的Java标准库和第三方库,包括图像处理、事件监听、文件操作等功能。然后我们还需要定义一个名为PixelListener的公共类,实现两个接口,用于处理按钮点击和鼠标滚轮事件。接下来我们需要定义几个对象用于实现功能,我们还需要用构造方法接收一个JPanel参数并赋值给centerPanel,我们还需要将图像文件加载并将其像素储存在PixelArr中,随后我们还需要设置Graphics对象。随后我们还需要处理按钮点击事件,随后再处理鼠标滚轮事件,我们需要判断是否处于缩放,然后根据滚轮方向调整像素块大小,请重新绘制图像,最后我们需要读取图像像素数据。
接下来我们展示最后一个公共类:
package shj26122;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class FilterImage {
private Graphics g;
private BufferedImage bufferedImage;
private String filterName;
private int PixelSize = 0;
public FilterImage(Graphics g) {
this.g = g;
}
public void setFilterName(String filterName) {
this.filterName = filterName;
}
public int getPixelSize() {
return PixelSize;
}
public void setPixelSize(int PixelSize) {
this.PixelSize = PixelSize;
}
public void filterImage(int[][] PixelArr) {
if (filterName == null) {
filterName = "原图";
}
switch (filterName) {
case "原图":
drawPixel(PixelArr);
break;
case "马赛克":
mosaic(PixelArr);
break;
}
}
public void drawPixel1(int[][] PixelArr) {
for (int i = 0; i < PixelArr.length; i++) {
for (int j = 0; j < PixelArr[0].length; j++) {
int rgb = PixelArr[i][j];
int red = rgb >> 16 & 0xFF;
int green = rgb >> 8 & 0xFF;
int blue = rgb >> 8 & 0xFF;
Color color = new Color(red, green, blue);
g.setColor(color);
g.drawLine(j, i, j, i);
}
}
}
public void drawPixel(int[][] PixelArr) {
BufferedImage bufferedImage = new BufferedImage(PixelArr[0].length, PixelArr.length, BufferedImage.TYPE_INT_RGB);
Graphics buffG = bufferedImage.getGraphics();
for (int i = 0; i < PixelArr.length; i++) {
for (int j = 0; j < PixelArr[0].length; j++) {
int rgb = PixelArr[i][j];
int red = rgb >> 16 & 0xFF;
int green = rgb >> 8 & 0xFF;
int blue = rgb >> 8 & 0xFF;
Color color = new Color(red, green, blue);
buffG.setColor(color);
buffG.drawLine(j, i, j, i);
}
}
g.drawImage(bufferedImage, 0, 0, PixelSize + bufferedImage.getWidth(), PixelSize + bufferedImage.getHeight(), null);
}
public void mosaic(int[][] PixelArr) {
BufferedImage bufferedImage = new BufferedImage(PixelArr[0].length, PixelArr.length, BufferedImage.TYPE_INT_RGB);
Graphics buffG = bufferedImage.getGraphics();
for (int i = 0; i < PixelArr.length; i += 10) {
for (int j = 0; j < PixelArr[0].length; j += 10) {
int rgb = PixelArr[i][j];
int red = rgb >> 16 & 0xFF;
int green = rgb >> 8 & 0xFF;
int blue = rgb >> 8 & 0xFF;
Color color = new Color(red, green, blue);
buffG.setColor(color);
buffG.fillRect(j, i, 10, 10);
}
}
g.drawImage(bufferedImage, 0, 0, PixelSize + bufferedImage.getWidth(), PixelSize + bufferedImage.getHeight(), null);
}
public int[][] rotate(int[][] PixelArr) {
int[][] nArr = new int[PixelArr[0].length][PixelArr.length];
for (int i = 0; i < PixelArr.length; i++) {
for (int j = 0; j < PixelArr[0].length; j++) {
nArr[j][PixelArr.length - 1 - i] = PixelArr[i][j];
}
}
return nArr;
}
public void grey(int[][] PixelArr) {
BufferedImage bufferedImage = new BufferedImage(PixelArr[0].length, PixelArr.length, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < PixelArr.length; i++) {
for (int j = 0; j < PixelArr[0].length; j++) {
int rgb = PixelArr[i][j];
int red = rgb >> 16 & 0xFF;
int green = rgb >> 8 & 0xFF;
int blue = rgb & 0xFF;
int greyValue = (int) (0.299 * red + 0.587 * green + 0.114 * blue);
int newRGB = (greyValue << 16) | (greyValue << 8) | greyValue;
bufferedImage.setRGB(j, i, newRGB);
}
}
g.drawImage(bufferedImage, 0, 0, null);
}
}
和上面一样,我们需要导入Java标准库以及第三方库,包括图像处理、swing组件、文件操作等功能。然后我们需要定义一个名为FilterImage的公共类,然后我们还需要定义一些成员变量,接下来我们需要用构造方法接收一个Graphics对象并赋值给成员变量g,然后我们需要设置当前滤镜名称以及设置并获取像素块大小,然后再设置通用滤镜应用方法,然后我们需要绘制原始像素,最后我们在对其他功能进行编写。
总结:
设计图像处理工具在Java中应该算是一个较为基础的项目,可以帮助初学者更加了解Java语言的使用。
956



被折叠的 条评论
为什么被折叠?



