Java imageio圖片處理
阿新 • • 發佈:2018-11-05
暑假就快要結束了,整理一下自己所學的
RGB565->RGB888
red = ( color & 0xf800 ) >> 8;
green = ( color & 0x07e0 ) >> 3;
blue = (color &0x001f ) << 3;
color_rgb888 = (red<<16) + (green<<8) + (blue<<0);
壓縮圖片
package cc; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; public class ImageUtil { public static void main(String[] args) throws IOException { String str = "C:\\Users\\fuchen\\Desktop\\timg.jpg"; // 需要壓縮圖片的地址 String str1 = "C:\\Users\\fuchen\\Desktop\\z.jpg"; // 壓縮後圖片的地址 boolean flag = compressPic(str, str1); if (flag) { System.out.println("成功"); } else { System.out.println("失敗"); } } // 需要壓縮的圖片的路徑,壓縮後生產的圖片的路徑 public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException { File file = null; BufferedImage src = null; FileOutputStream out = null; ImageWriter imgWrier; ImageWriteParam imgWriteParams; // 指定寫圖片的方式為 jpg imgWrier = ImageIO.getImageWritersByFormatName("jpg").next(); imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null); // 要使用壓縮,必須指定壓縮方式為MODE_EXPLICIT imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT); // 這裡指定壓縮的程度,引數qality是取值0~1範圍內, imgWriteParams.setCompressionQuality((float) 0.1); imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED); ColorModel colorModel = ImageIO.read(new File(srcFilePath)).getColorModel();// ColorModel.getRGBdefault(); // 指定壓縮時使用的色彩模式 // imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier( // colorModel, colorModel.createCompatibleSampleModel(16, 16))); imgWriteParams.setDestinationType( new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16))); try { if (isBlank(srcFilePath)) { return false; } else { file = new File(srcFilePath); System.out.println(file.length()); src = ImageIO.read(file); // 我去將它轉化為 二維陣列 /* * // 將圖片轉換為二維陣列 int[][] rgbArray1 = convertImageToArray(src); // 輸出圖片到指定檔案 * writeImageFromArray("C:\\Users\\fuchen\\Desktop\\轉化成功.jpg", "jpg", * rgbArray1);// 這裡寫你要輸出的絕對路徑+檔名 System.out.println("圖片輸出完畢!"); */ out = new FileOutputStream(descFilePath); imgWrier.reset(); // 必須先指定 out值,才能呼叫write方法, ImageOutputStream可以通過任何 // OutputStream構造 imgWrier.setOutput(ImageIO.createImageOutputStream(out)); // 呼叫write方法,就可以向輸入流寫圖片 imgWrier.write(null, new IIOImage(src, null, null), imgWriteParams); out.flush(); out.close(); } } catch (Exception e) { e.printStackTrace(); return false; } return true; } public static boolean isBlank(String string) { if (string == null || string.length() == 0 || string.trim().equals("")) { return true; } return false; } // BufferedImage所讀取的圖片檔案轉化為畫素陣列 public static int[][] convertImageToArray(BufferedImage bf) { // 獲取圖片寬度和高度 int width = bf.getWidth(); int height = bf.getHeight(); // 將圖片sRGB資料寫入一維陣列 int[] data = new int[width * height]; bf.getRGB(0, 0, width, height, data, 0, width); // 將一維陣列轉換為為二維陣列 int[][] rgbArray = new int[height][width]; for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) rgbArray[i][j] = data[i * width + j]; return rgbArray; } }
複製圖片
package cc; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.imageio.ImageIO; public class zz { public static void main(String[] args) throws FileNotFoundException { // 讀取圖片到BufferedImage BufferedImage bf = readImage("C:\\Users\\fuchen\\Desktop\\timg.jpg");// 這裡寫你要讀取的絕對路徑+檔名 System.out.println(bf.toString()); // 將圖片轉換為二維陣列 int[][] rgbArray1 = convertImageToArray(bf); // 輸出圖片到指定檔案 writeImageFromArray("C:\\Users\\fuchen\\Desktop\\轉化成功zz.jpg", "jpg", rgbArray1);// 這裡寫你要輸出的絕對路徑+檔名 System.out.println("圖片輸出完畢!"); } public static BufferedImage readImage(String imageFile) { File file = new File(imageFile); BufferedImage bf = null; try { bf = ImageIO.read(file); } catch (IOException e) { e.printStackTrace(); } return bf; } public static int[][] convertImageToArray(BufferedImage bf) { // 獲取圖片寬度和高度 int width = bf.getWidth(); int height = bf.getHeight(); // 將圖片sRGB資料寫入一維陣列 int[] data = new int[width * height]; bf.getRGB(0, 0, width, height, data, 0, width); // 將一維陣列轉換為為二維陣列 int[][] rgbArray = new int[height][width]; for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) rgbArray[i][j] = data[i * width + j]; return rgbArray; } public static void writeImageFromArray(String imageFile, String type, int[][] rgbArray) throws FileNotFoundException { // 獲取陣列寬度和高度 int width = rgbArray[0].length; int height = rgbArray.length; System.out.println("width = " + width + " height = " + height); int[] data = new int[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { data[i * width + j] = rgbArray[i][j]; data[i * width + j] = data[i * width + j]; } } // 將資料寫入BufferedImage BufferedImage bf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); bf.setRGB(0, 0, width, height, data, 0, width); // 輸出圖片 try { File file = new File(imageFile); ImageIO.write((RenderedImage) bf, type, file); } catch (IOException e) { e.printStackTrace(); } } }