日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/3/13 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 图片不失真缩放,ico格式图片转换,透明图层,jar->exe 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。