记得我以前写过图像处理的文章是用大学里教的数字图像处理来操作,用个Matlab,不过最近实习中和一妹纸起了一点小冲突,双方都没多少时间处理这些资源,然后我是静下心来去思考了,妹纸怎么会花这么多的时间在这一工作上。
然后跑过去沟通,了解她整个工作的流程,果然有所发现,她修改图片大小是用美图来一张一张改的,整个过程花了1个小时,心里灵机一动,批量处理肯定能写,以前做过类似的,但是妹纸没有Matlab。为了解放生产力,我还是晚上时间把东西赶了出来。
首先说一下文件的规定,有多个文件,每个文件有jpg和png这种格式的图片,需要把jpg的规格全部调成600*400规格,针对横屏图片,针对竖屏图片,将分辨率互换,png格式图片调成200*200。
首先是先要指定文件夹,将之前规定好的文件夹放进去。
File f = new File("E://console"); if (!f.exists()) { f.mkdir(); }
指定为e盘的console文件夹。有了这个文件夹后,如果文件夹没有文件,是需要给妹纸提个醒的。
if (f.listFiles() == null) { System.out.println("E://consolegame 目录下没有游戏"); }
有这个目录之后,遍历文件,寻找以png为后缀的文件。
for (File everyfile : game.listFiles()) { if (everyfile.getName().split("\\.")[1].equals("png")) { <span style="font-size:18px;"> }</span><p><span style="font-size:18px;">}</span></p>
split里面的参数是正则表达式,点是匹配单个字符的意思,所以需要转义字符\,而细心地会发现,其实windows里面的路径为反斜杠,其实输入斜杆访问也可以进行访问。Java中并不能直接识别反斜杠为转义字符,所以需要写成\\。
将文件名和文件类型名瓜分为数组,然后取出所需的文件:
try { System.out.println(chinese); //BufferedImage为Image的子类 ImageIO的read方法返回为BufferedImage BufferedImage image = ImageIO.read(everyfile); System.out.println(chinese+"图标png文件已缩放为x*x规格"); // System.out.println(image.getWidth()); // System.out.println(image.getHeight()); //创建图像的缩放版本,前两个参数分别为图像宽度和高度,最后是图像取样算法 //Image.SCALE_SMOOTH是图像平滑度比缩放速度更具优先级的算法 //SCALE_FAST 缩放速度比图像平滑度更具优先级的算法 Image newimage = image.getScaledInstance(pngwidth, pngheight, Image.SCALE_SMOOTH); //构造图像,最后一参数为图像颜色分量为RGB BufferedImage board = new BufferedImage(pngwidth, pngheight, BufferedImage.TYPE_INT_RGB); //方法返回Graphics2D,为Graphics的子类,其实用createGraphics更方便,为向后兼容考虑 //用于绘制图像 Graphics g = board.getGraphics(); //第一个参数为需要绘制的图像,第二和第三个参数为x和y坐标,第三个参数为图像非透明部分绘制的 //背景色,最后一个为转换图像需要通知的对象(这个不是很了解) g.drawImage(newimage,0,0,Color.white,null); //释放资源 g.dispose(); //将原文件删除 everyfile.delete(); ImageIO.write(board,"png",new File("E://console//"+everyfile.getName())); } catch (IOException e) { e.printStackTrace(); }
图像处理部分,没想到用Java处理起来比Matlab简单,毕竟Matlab是自己直接去操作每个像素了。
剩下的还有jpg格式的,但是处理要根据是竖屏图片还是横屏图片进行分别调整,总不能把横屏的压扁了,竖屏的压矮了。
if (everyfile.getName().split("\\.")[1].equals("jpg")) { try { BufferedImage image = ImageIO.read(everyfile); Image newimage = null; BufferedImage board = null; if(image.getWidth()>image.getHeight()){ newimage = image.getScaledInstance(jpgwidth, jpgheight, Image.SCALE_SMOOTH); board = new BufferedImage(jpgwidth, jpgheight, BufferedImage.SCALE_SMOOTH); System.out.println(everyfile.getName()+"素材jpg文件已缩放为x*x"); }else{ newimage = image.getScaledInstance(jpgheight,jpgwidth,Image.SCALE_SMOOTH); board = new BufferedImage( jpgheight,jpgwidth,BufferedImage.SCALE_SMOOTH); System.out.println(everyfile.getName()+"素材jpg文件已缩放为x*x"); } Graphics g = board.getGraphics(); g.drawImage(newimage,0,0,null); g.dispose(); everyfile.delete(); ImageIO.write(board,"jpg",new File("E://console//"+everyfile.getName())); } catch (IOException e) { e.printStackTrace(); }
原理与上面相同。
最后的成就感爆棚,妹纸的生产力解放,其实只要在电脑上进行操作,编程的东西基本都能用到。那晚,自己一边傻笑一边走回家。是的,程序员就是会感叹自己的做的东西好牛逼的。
不过Java有Java的局限性所在,当我编译的版本比妹纸运行版本高的时候,问题就来了,这种问题的话,还是用C++更好。