Java Swing 图像处理程序技术笔记
一、项目概述本项目是基于 Java Swing 开发的桌面图像处理工具核心功能包括图像加载、多种滤镜效果、图层撤销以及图像重绘机制。项目通过自定义 JPanel 重写 paint 方法结合缓冲图像BufferedImage实现高效的图像渲染与状态管理。二、核心架构与类设计核心类分工PixelUI 程序入口类负责初始化 Swing 窗口、布局管理、组件创建与事件监听器绑定。MPanel 自定义绘图面板继承 JPanel 并重写 paint 方法实现图像的最终渲染。PixelListener 事件处理类实现 ActionListener 和 MouseWheelListener处理按钮点击与滚轮缩放。FilterImage 滤镜算法封装类包含所有图像处理逻辑绘制、马赛克、旋转、卷积等。关键设计思想缓冲图像重绘机制所有绘制操作先在 BufferedImage 中完成再通过 MPanel.paint() 一次性渲染到屏幕避免频繁重绘导致的闪烁。事件驱动交互通过监听器模式分离 UI 与业务逻辑提升代码可维护性。像素数组操作将图像数据读取为二维 int 数组便于直接操作像素值实现各种滤镜效果。三、核心技术实现细节图像加载与像素读取publicint[][]getPixel(Filefile){BufferedImagebufferedImageImageIO.read(file);inthbufferedImage.getHeight();intwbufferedImage.getWidth();int[][]pixelArrnewint[h][w];for(inti0;ih;i){for(intj0;jw;j){pixelArr[i][j]bufferedImage.getRGB(j,i);}}returnpixelArr;}自定义面板与重绘机制MPanel 继承 JPanel 并重写方法调用 super.paint(g) 保留原有组件绘制逻辑。从 FilterImage 中获取缓冲图像调用 g.drawImage() 渲染到面板。当窗口状态改变时Swing 会自动调用 paint() 方法保证图像始终正确显示。publicclassMPanelextendsJPanel{privateFilterImagefilter;publicvoidsetFilterImage(FilterImagefilter){this.filterfilter;}Overridepublicvoidpaint(Graphicsg){super.paint(g);g.drawImage(filter.bufferedImage,0,0,null);}}滤镜算法实现1原图绘制遍历像素数组将每个像素的 RGB 分量提取后在缓冲图像上绘制对应像素点支持通过 pixelSize 实现缩放。publicvoiddrawPixel(int[][]pixelArr){bufferedImagenewBufferedImage(pixelArr[0].length,pixelArr.length,BufferedImage.TYPE_INT_RGB);GraphicsbuffGbufferedImage.getGraphics();for(inti0;ipixelArr.length;i){for(intj0;jpixelArr[0].length;j){intrgbpixelArr[i][j];intred(rgb16)0xFF;intgreen(rgb8)0xFF;intbluergb0xFF;ColorcolornewColor(red,green,blue);buffG.setColor(color);buffG.drawLine(j,i,j,i);}}}2马赛克效果以 10x10 像素为一个块取块内第一个像素的颜色填充整个块实现模糊马赛克效果。publicvoidmosaic(int[][]pixelArr){bufferedImagenewBufferedImage(pixelArr[0].length,pixelArr.length,BufferedImage.TYPE_INT_RGB);GraphicsbuffGbufferedImage.getGraphics();for(inti0;ipixelArr.length;i10){for(intj0;jpixelArr[0].length;j10){intrgbpixelArr[i][j];intred(rgb16)0xFF;intgreen(rgb8)0xFF;intbluergb0xFF;ColorcolornewColor(red,green,blue);buffG.setColor(color);buffG.fillRect(j,i,10,10);}}}3图像旋转通过行列互换实现图像 90° 旋转生成新的像素数组。publicint[][]rotate(int[][]pixelArr){int[][]nArrnewint[pixelArr[0].length][pixelArr.length];for(inti0;ipixelArr.length;i){for(intj0;jpixelArr[0].length;j){nArr[j][pixelArr.length-1-i]pixelArr[i][j];}}returnnArr;}4卷积滤波定义卷积核遍历图像像素与核进行加权求和实现图像增强效果。int[][]kernel{{-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1},{-1,-1,25,-1,-1},{-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1}};publicvoidconvolution(int[][]pixelArr){inthpixelArr.length-kernel.length1;intwpixelArr[0].length-kernel[0].length1;int[][]convolutionPixelnewint[h][w];}四、图像重绘问题分析与优化重绘触发场景窗口大小调整、最小化 / 最大化、隐藏 / 显示。调用 repaint() 或 paint() 主动触发。组件覆盖 / 暴露。闪烁问题解决双缓冲机制所有绘制操作先在 BufferedImage 中完成再一次性绘制到屏幕避免逐像素绘制导致的闪烁。避免在 paint () 中执行业务逻辑paint() 仅负责渲染缓冲图像耗时操作在事件处理中完成。状态丢失问题每次滤镜操作后将结果保存到 FilterImage.bufferedImage 中MPanel.paint() 直接读取该缓冲图像保证重绘时状态不丢失。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414591.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!