前言:
在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();
}
}
这次的PixelUi与上一篇中的没有区别,接下来展示PixelListener:
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"镜面翻转":
filter.flip(PixelArr);
break;
case"保存":
filter.saveImage(PixelArr);
break;
case"复古":
filter.filmMode(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;
}
}
这个公共类对比上一篇,多了三个需要实现的功能:镜面翻转、保存和复古,接下来展示最后一个公共类:
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);
}
public void flip(int[][] PixelArr) {
for (int i = 0; i < PixelArr.length; i++) {
for (int j = 0; j < PixelArr[0].length; j++) {
int rgb = PixelArr[i][PixelArr[0].length - 1 - j];
int red = rgb >> 16 & 0xFF;
int green = rgb >> 8 & 0xFF;
int blue = rgb & 0xFF;
Color color = new Color(red, green, blue);
g.setColor(color);
g.drawLine(j, i, j, i);
}
}
g.drawImage(bufferedImage, 0, 0, null);
}
public void filmMode(int[][] PixelArr){
BufferedImage bufferedImage=new BufferedImage(PixelArr[0].length,PixelArr.length,BufferedImage.TYPE_INT_RGB);
Graphics buffG=bufferedImage.getGraphics();
int centerX=PixelArr[0].length/2;
int centerY=PixelArr.length/2;
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;
red=Math.min(255,(int)(red*1.2));
green=Math.min(255,(int)(green*1.1));
blue=Math.max(0,(int)(blue*0.9));
double distance=Math.sqrt(Math.pow(i-centerY,2)+Math.pow(j-centerX,2));
double maxDistance=Math.sqrt(Math.pow(centerX,2)+Math.pow(centerY,2));
double vignetteFactor=1.0-(distance/maxDistance)*0.5;
red=(int)(red*vignetteFactor);
green=(int)(green*vignetteFactor);
blue=(int)(blue*vignetteFactor);
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 saveImage(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++) {
bufferedImage.setRGB(j, i, PixelArr[i][j]);
}
}
JFileChooser jfc = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("图片文件", "jpg", "png", "bmp");
jfc.setFileFilter(filter);
int result = jfc.showSaveDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
File file = jfc.getSelectedFile();
String format="png";
if(file.getName().toLowerCase().endsWith(".jpg")||file.getName().toLowerCase().endsWith(".jpeg")){
format="jpg";
}else if(file.getName().toLowerCase().endsWith(".png")){
format="bmp";
}
try {
ImageIO.write(bufferedImage, format, file);
JOptionPane.showMessageDialog(null, "图像已保存到:" + file.getAbsolutePath());
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "保存失败:" + e.getMessage());
}
}
}
}
这个公共类对比上一篇的,多实现了三个功能。
总结:
最后一个公共类中,实现功能的代码大部分相同,只需要改变一些数值就可以实现不同的功能,这个项目可以帮助初学者更好的理解和使用Java代码。
2518



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



