Java 图片缩放,转ico格式

Java 在转换图片格式为 ico 时 需要引入 image4j 的依赖,这里分享一个自己写好的并通过exe4j 打包好的exe小程序。因为功能太少所以再引入 thumbnailator 的依赖缩放图片,源码连接在最后。

依赖

<!-- 引入依赖--><dependency><groupId>net.ifok.image</groupId><artifactId>image4j</artifactId><version>0.7.2</version></dependency>
<!-- 缩放图片的工具类 --><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.19</version></dependency>

ico图标转换

ico图标可以存储单个图案、多尺寸、多色板的图标文件。通常作为标志,目前主流的浏览器都支持ICO图标,在浏览器的地址栏、标签及收藏夹上显示,也可以用来,个性化设置文件夹或者程序。图标有一套标准的大小和属性格式,且通常是小尺寸的。(16,32,48,64,128,256)

截图来自:https://github.com/imcdonagh/image4j,主要就4个API,读取与转换 BMP与ICO两种格式。

这里只说 ICO。因为 ImageIO.write(缓冲图, “格式”, 流); 可以直接处理输出bmp格式。

    @Testpublic void test01() {//        图片读取路径String inputPath = "F://1.jpeg";
//        输出路径String outputPath = "F://0.ico";// 把需要关闭的流放在 try(  里 ){。。。try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputPath));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outputPath));) {// 读取 图片BufferedImage img = ImageIO.read(bis);// 写出 图片
//            ICOEncoder.write(Arrays.asList(img), bos);ICOEncoder.write(Collections.singletonList(img), bos);} catch (IOException e) {e.printStackTrace();}}
    // 其他格式jpg/jpeg/png/gif/bmp 写出图片 记得格式后缀与格式相同 jpg比较省空间ImageIO.write(img,"jpg", bos);

因为一般ico图标尺寸都在256以下,这个工具类最多也就转换300*300 的图标,所以需要进行图片的缩放操作。

Thumbnails缩放操作

主要的一些操作。

.of ( ) 文件路径 ,流 或者 缓存图片

.toFile( “D://xxx.jpg” ) 文件转存路径

.asBufferedImage() 返回缓存图片

.toOutputStream(os) 赋予输出流

.size( w, h ) 按指定大小调整,配值 .keepAspectRatio(false) 取消默认的比例变化,会变形

.scale(0.25f) 按比例缩放。

.sourceRegion(x, y, w, h) 裁剪,前两个参数可以用枚举类 Positions.

​ 这个在另一篇里用到了

.rotate(-90) 旋转 正数:顺时针 负数:逆时针

.watermark(位置,水印图,透明度) 加水印

.outputQuality(0.8f) 图片质量

.outputFormat(“png”) 转图片格式 ,鸡肋

这里简单使用一下

    @Testpublic void test02() {//        图片读取路径String inputPath = "F://1.jpeg";
//        输出路径String outputPath = "F://1.ico";// 把需要关闭的流放在 try(  里 ){。。。try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputPath));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outputPath));) {// 读取 图片BufferedImage img = ImageIO.read(bis);//of( inputPath / img ) 都可以 img= Thumbnails.of(img).size(256, 256).keepAspectRatio(false).outputQuality(1f).asBufferedImage();// 写出 图片ICOEncoder.write(Collections.singletonList(img), bos);} catch (IOException e) {e.printStackTrace();}}

好了主要功能就这些,为了方便以后使用,把这些东西写成窗体应用,导入使用一个美化包 flatlaf

<!-- GUI窗体应用美化包 --><dependency><groupId>com.formdev</groupId><artifactId>flatlaf</artifactId><version>3.1</version></dependency>
使用://  初始化美化包。FlatLightLaf.installLafInfo();try {//  设置美化包风格。
//    FlatDarkLaf()、FlatLightLaf()、
//    FlatDarculaLaf()、FlatIntelliJLaf()这四种对象风格UIManager.setLookAndFeel(new FlatLightLaf());} catch (Exception ex) {System.err.println("窗体美化包加载失败!!");}

窗体页面样式:

展开后:

//转存路径默认是桌面地址。
String homePath=FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath();

选择一张图片:

这个浏览文件是一个现成的窗体 JFileChooser 具体使用:

   @Testpublic void test03() {JFileChooser chooser = new JFileChooser();chooser.setDialogTitle("文件资源选择");
//      设置默认选择路径     new File(".")//当前文件的目录,,chooser.setCurrentDirectory(new File("D://"));
//      设置可选择文件
//      FILES_ONLY: 只能选文件;DIRECTORIES_ONLY: 只能选文件夹;
//      FILES_AND_DIRECTORIES: 文件和文件夹都可以选。chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);chooser.setMultiSelectionEnabled(true);//是否可多选,默认false
//        设置文件过滤器(可选择的文件类型):默认所有文件
//        chooser.setFileFilter("提示信息","后缀1","2");//设置默认使用的文件过滤器
//        chooser.addChoosableFileFilter(..);//设置候选的文件过滤器
//     eg:chooser.addChoosableFileFilter(new FileNameExtensionFilter("zip(*.rar,...)", "zip", "rar", "7z"));//压缩文件过滤器chooser.setApproveButtonText("这是选择按钮");// 设置按钮文本
//        CANCEL_OPTION: 点击了取消或关闭 ;APPROVE_OPTION: 点击了确认或保存 ;
//        ERROR_OPTION: 出现错误。int state=chooser.showOpenDialog(null);if(state== JFileChooser.APPROVE_OPTION){// 点击了 这是选择按钮 // 获取选择的文件流,前面若是设置了多选这里记得用getSelectedFile接取File file = chooser.getSelectedFile();System.out.println(file.getAbsoluteFile().toString());}}

这里简单使用一下:

    /** 筛选图片*/private void scanPath() {JFileChooser chooser = new JFileChooser();chooser.setDialogTitle("筛选图片");chooser.setCurrentDirectory(new File("D://"));chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);chooser.setMultiSelectionEnabled(false);// 设置默认筛选图片chooser.setFileFilter(new FileNameExtensionFilter("image(*.jpg,*.png,.gif)", "jpeg", "jpg", "png", "gif"));chooser.setApproveButtonText("选择");int state = chooser.showOpenDialog(null);if (state == JFileChooser.APPROVE_OPTION) {//     获取选择的文件流File pathFiles = chooser.getSelectedFile();if (!pathFiles.isDirectory()) {// 当选择的是文件的时候触发记录绝对路径,// 没考虑闲的无聊改筛选设置为全部,然后选不是图片的文件。inputPath = pathFiles.getAbsolutePath();。。。}}}

这个文件选择的弹框是现成的,也可以自己写一些功能弹框。

注意事项:
// 子窗体的关闭的配置  不要使用 EXIT_ON_CLOSE
child.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// 子窗体关闭除了点×还可以在按钮事件里调用 System.exit(0); 关闭

这是选择图片后的预览:

因为是直接在面板绘制的没考虑画面重叠的问题这里简单解决一些:

// 获取面板画笔对象
final Graphics g = imageBox.getGraphics();
// 这里设置画笔颜色为面板颜色,然后调用填充方法直接把整个面板初始化为背景色
g.setColor(imageBox.getBackground());
g.fillRect(0,0,imageBox.getWidth(),imageBox.getHeight());BufferedImage img2 = null;
try {img2 = Thumbnails.of(image).size(imageBox.getWidth(),imageBox.getHeight()).asBufferedImage();
} catch (IOException e) {e.printStackTrace();
}
assert img2 != null;
g.drawImage(img2, 0, 0, null);

双缓冲

这样虽然可以解决,但是会绘制两次,有点闪,所有可以先用画笔在图片上绘制,处理好之后在统一绘制到面板上,这样也可以避免一些高帧渲染问题。

// 获取面板画笔对象
final Graphics g = imageBox.getGraphics();
//            // 这里设置画笔颜色为面板颜色,然后调用填充方法直接把整个面板初始化为背景色
//            g.setColor(imageBox.getBackground());
//            g.fillRect(0,0,imageBox.getWidth(),imageBox.getHeight());
BufferedImage img2 = null;
try {img2 = Thumbnails.of(image).size(imageBox.getWidth(), imageBox.getHeight()).asBufferedImage();
} catch (IOException e) {e.printStackTrace();
}
assert img2 != null;
//            g.drawImage(img2, 0, 0, null);
// 新建图层,获取画笔对象,
BufferedImage img3 = new BufferedImage(imageBox.getWidth(), imageBox.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics g2d=img3.createGraphics();
g2d.setColor(imageBox.getBackground());
// img3图片底色填充,画笔也可以写文字
g2d.fillRect(0,0,img3.getWidth(),img3.getHeight());
g2d.drawImage(img2, 0, 0, null);
g.drawImage(img3, 0, 0, null);

这样处理后只用绘制一次,而且图片已经在缓存里绘制起来更快。

透明度

// 图层也可以是透明色
BufferedImage buffImg = new BufferedImage(width, heigth, BufferedImage.TYPE_INT_RGB);
/**获取画笔对象*/
Graphics2D g2d = buffImg.createGraphics();
// ----------  增加下面的代码使得背景透明  -----------------
buffImg = g2d.getDeviceConfiguration().createCompatibleImage(width, heigth, Transparency.TRANSLUCENT);
// 注,此时图片画笔对象需要重新获取一下
//        g2d.dispose();//释放画笔,可省
g2d = buffImg.createGraphics();// 透明图层能用来干嘛我也不清楚,不过输出带透明度的图片格式记得设定png,因为jpg省空间但有损。
//文字水印,及简单图像
g2d.setColor(color);
// 设置 Font
g2d.setFont(new Font("微软雅黑", Font.ROMAN_BASELINE, 33));//默认:Dialog
//设置透明度:1.0f为透明度 ,值从0-1.0,依次变得不透明
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g2d.drawString("水印", x, y);// 文字
g2d.drawRect(x,y,width,heigth);// 绘制矩形
g2d.fillPolygon(int[] x坐标,int[] y坐标,int 点数量);// 点连线闭合图形

这里的缩放也是使用 Thumbnails 的工具类方法,肯定还有其他同类型的工具类,如果只是应用程序进行鼠标滚轮缩放图片仅显示的话,缩放画布就可以了。

// 缩放画布
g.scale(scale, scale);
//  这个缩放的画笔对象是面板,原图直接绘制,
double scale = 面板宽*1.0/原图宽;
// 如果用 双缓冲 那新建图层的长宽就是,面板长,宽/scale
// 这种缩放简单,只能用于显示,没有处理后的结果不能保存;

这里的缩放也是使用 Thumbnails 的工具类方法,肯定还有其他同类型的工具类,如果只是应用程序进行鼠标滚轮缩放图片仅显示的话,缩放画布就可以了。

// 缩放画布
g.scale(scale, scale);
//  这个缩放的画笔对象是面板,原图直接绘制,
double scale = 面板宽*1.0/原图宽;
// 如果用 双缓冲 那新建图层的长宽就是,面板长,宽/scale
// 这种缩放简单,只能用于显示,没有处理后的结果不能保存;

下载地址

已经打好exe包:https://pan.baidu.com/s/1cen_C6zZrauoJhWyYNuV1A?pwd=6666
源码: https://gitee.com/song-wei-185/Simple-image-conversion.git

jar包运行需要 jre 运行环境, 通过exe4j 可以一起打成 exe包直接运行。

java 图片不失真缩放,ico格式图片转换,透明图层,jar->exe相关推荐

  1. ps保存的图片找不到ico格式怎么办?

    (欢迎光临差–点先生的博客) ps保存的图片找不到ico格式的解决方法 第一种情况: 第二种情况: 第一种情况: 图片像素太大,导致无法保存为ico文件格式. 因为ico文件最大像素为64x64,也就 ...

  2. HTML+CSS项目实践四:给html网页标题栏添加logo图标(ico格式图片)

    实现效果: 制作思路: 1.准备一张ico格式图片 2.在<head>标签里使用<link />标签,引用icon图片 实现代码: <!DOCTYPE HTML> ...

  3. 一键完成:批量转pdf图片为png、svg格式图片

    记得以前使用texlive2020时,只要在standalone的选项里面使用convert选项,再加一些设置,就能自动生成高清png 格式的图片了. 自从升级为exlive2022后,才发现再也不能 ...

  4. c语言实现pdf显示图片,C语言读取BMP格式图片.pdf

    C语言读取BMP格式图片 C 语言读取BMP 格式图片 以下摘自维基百科,自由的百科全书 BMP 取自位图BitMaP 的缩写,也称为DIB (与设备无关的位图)是微软视窗图形 子系统(Graphic ...

  5. java icon显示图片_java显示ico格式图片

    展开全部 不知道你是不是要这种效果 代码如下: //要求:在JFrame里面显示一个ico格式的图片,放在JPanel,JLable,或32313133353236313431303231363533 ...

  6. Mac版PhotoShop输出ico格式图片,包括Photoshop cc

    首先,如果打开了Photoshop一定要先关闭再进行以下操作,不然有可能会失败! 插件下载: 下载对应版本后打开Finder(文件管理器),在应用程序中找到Photoshop目录中的Plug-ins文 ...

  7. java图片不失真压缩_(转)图片等比压缩,确保不失真

    importjava.awt.Image;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.FileOutputS ...

  8. Freemarker下载Word文档(文字+图片+表格)Idea示例 (附word展示图片异常解决方案)(附JPEG格式图片通过imageio.read方法读取为null解决方案)

    流程:拿到word模板 转为ftl格式并填充占位符参数,调用java代码填充参数即可 (文末附word打开图片显示异常,wps打开却显示正常的解决方案) (文末附Jpeg格式图片获取为null解决方案 ...

  9. CSS实现图片居中且缩放不影响图片纵横比

    实现代码 我们在编写页面代码的时候往往会需要添加图片.在使用过程中,获取的图片尺寸经常可能和页面需要的尺寸不一致,这时候就需要对获取图片进行缩放. 对图片缩放有一定技巧,或者说是固定的编写代码套路.否 ...

最新文章

  1. Shell生成随机数并输出文件对应行
  2. WinEdt(latex)详而简单教程
  3. 百度开源的 71 个项目,看看你用过几个?
  4. Dictionary,hashtable, stl:map有什么异同?
  5. mac下用vim编写程序
  6. 42_ResNet (深度残差网络)---学习笔记
  7. 实体词典 情感词典_人工智能技术落地:情感分析概述
  8. 使用labelme制作自己的深度学习图像分割数据集
  9. gitlab使用_使用 Docker 部署 Gitlab
  10. 使用拓扑数据分析理解卷积神经网络模型的工作过程
  11. HashMap,TreeMap,LinkedHashMap学习
  12. 【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
  13. 2022年PMP考试应该注意些什么?
  14. 使用stream给list集合排序
  15. 用手机当电脑摄像头——Droidcam
  16. 开发转测试的面试总结
  17. 超市火灾烟气蔓延及人员疏散的matlab仿真模拟
  18. go 的基本命令详解
  19. freeswitch呼叫中心之百度MRCP语音合成识别环境搭建
  20. 建议收藏!!! 若依框架文档开发手册[持续更新]

热门文章

  1. java定义私有变量_Java Reflection(七):私有变量和私有方法
  2. ad16 怎么设置单独元件间距_AD软件中怎么添加不同元素之间的间距规则?
  3. 麦凯隆全屋分质供水 保障家庭饮用水安全与健康
  4. untiy的http请求
  5. windows 删除服务_哪些Windows 10 系统服务可以安全禁用?
  6. CrossBar 将 PUF 技术引入 ReRAM
  7. 火车票订票小助手,帮助了很多同事和朋友,安全无毒
  8. 快速关闭SELinux
  9. 1.数学建模比赛前期准备
  10. 教你如何给小米5续命