เมื่อเร็ว ๆ นี้ฉันต้องการการประมวลผลการบีบอัดภาพเพื่อทำโครงการ วิธีการส่วนใหญ่ที่ฉันค้นหาออนไลน์ใช้คลาส jpegimageencoder ในแพ็คเกจ com.sun.image.codec.jpeg.* หลังจากแนะนำแพ็คเกจนี้ฉันได้รายงานข้อผิดพลาด Google Baidu ต่าง ๆ ได้ลองใช้วิธีการต่าง ๆ รวมถึง RT.JAR ด้วยตนเองใน JRE และเปลี่ยน API ที่ จำกัด การเข้าถึงจากข้อผิดพลาดไปสู่การเตือนใน Eclipse ฯลฯ อย่างไรก็ตามสิ่งเหล่านี้ไม่ดีเพราะฉันพบว่าไม่มี com.sun.image* ใน Rt.jar ใน Java-7-openjdk-amd64 ดูเหมือนว่าคลาสนี้จะถูกลบออกอย่างสมบูรณ์ใน Java7 อย่างน้อยฉันก็ไม่มีเวอร์ชัน จากนั้นฉันค้นหาโซลูชันทางเลือกเพื่อใช้คลาส Imageio สำหรับการประมวลผลรหัสมีดังนี้:
สามารถบีบอัดได้ทุกขนาดคำจำกัดความสูงหลังจากการบีบอัดโดยไม่มีการเสียรูป (พื้นที่สีขาว) ชื่อต่อท้ายสามารถเปลี่ยนได้และสามารถแก้ไขความละเอียดการบีบอัดได้
บางทีเพื่อนบางคนก็ต้องการสิ่งนี้ โปรดดูที่ หากคุณมีคำถามใด ๆ โปรดให้หลักฐานฉัน!
แพ็คเกจ cn.com.images; นำเข้า java.awt.graphics; นำเข้า java.awt.image; นำเข้า java.awt.image.bufferedimage; นำเข้า Java.io.File; นำเข้า java.io.ioException; นำเข้า java.math.bigdecimal; นำเข้า java.math.mathcontext; นำเข้า java.util.arraylist; นำเข้า Javax.imageio.imageio; /*** * การดำเนินการบนรูปภาพ * * @author Chenzheng_java * @Since 2011/7/29 * */คลาสสาธารณะ ImageHelper {ส่วนตัวคงที่ ImageHelper ImageHelper = NULL; สาธารณะ ImageHelper GetImageHelper () {ถ้า (imageHelper == null) {imageHelper = ใหม่ imageHelper (); } return imageHelper; } / *** * ปรับขนาดภาพที่สเกลที่ระบุ * * @param SourceImagePath * ที่อยู่แหล่งที่มา * @param ปลายทาง path * ที่อยู่ของภาพหลังจากเปลี่ยนขนาด * @param สเกล * มาตราส่วนเช่น 1.2 * / โมฆะสาธารณะสเกรต (SourceImagePath String, String ปลายทาง bufferedimage bufferedimage; ลอง {bufferedImage = imageio.read (ไฟล์); ความกว้าง int = bufferedImage.getWidth (); ความสูง int = bufferedImage.getheight (); WIDTH = PARSEDOUBLETOINT (ความกว้าง * มาตราส่วน); ความสูง = parsedoubleToint (ความสูง * มาตราส่วน); Image image = bufferedImage.getScaledInstance (ความกว้าง, ความสูง, image.scale_smooth); bufferedImage outputImage = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); กราฟิกกราฟิก = outputImage.getGraphics (); graphics.drawimage (ภาพ, 0, 0, null); graphics.dispose (); imageio.write (outputImage, รูปแบบ, ไฟล์ใหม่ (ปลายทาง path)); } catch (ioexception e) {system.out.println ("เกิดข้อผิดพลาดในขณะที่บีบอัดภาพ"); E.PrintStackTrace (); }} / **** ปรับระดับภาพให้อยู่ที่ความสูงหรือความกว้างที่ระบุ* @param SourceImagePath ที่อยู่แหล่งที่อยู่ภาพ* @param ที่อยู่ปลายทางของภาพหลังจากบีบอัดภาพ* @param ความกว้างความกว้างของความกว้าง* @param ความสูงระดับความสูง* @param อัตโนมัติ SourceImagePath, String DestinationPath, ความกว้าง int, ความสูง int, boolean auto, รูปแบบสตริง) {ลอง {ไฟล์ไฟล์ = ไฟล์ใหม่ (SourceImagePath); bufferedImage bufferedImage = null; bufferedImage = imageio.read (ไฟล์); if (อัตโนมัติ) {arraylist <integer> paramsarrayList = getAutowidThandHeight (bufferedImage, ความกว้าง, ความสูง); ความกว้าง = paramsarraylist.get (0); ความสูง = paramsarraylist.get (1); System.out.println ("ปรับขนาดอัตโนมัติความกว้าง ="+ความกว้าง+"เมธอด ScaleImageWithParams ผิดพลาดเมื่อบีบอัดภาพ"); E.PrintStackTrace (); }} / ** * แปลงข้อมูลประเภทสองเท่าเป็น int, การปัดเศษหลักการ * * @param sourcedouble * @return * / ส่วนตัวคงที่ int parsedoubleToint (สอง sourcedouble) {int result = 0; ผลลัพธ์ = (int) sourcedouble; ผลการกลับมา; } / ***** @param bufferedImage วัตถุภาพที่จะปรับขนาด* @param width_scale ความกว้างเพื่อปรับขนาดถึง* @param height_scale ความสูงเพื่อปรับขนาดให้เป็น* @return a คอลเลกชันองค์ประกอบแรกคือความกว้างและองค์ประกอบที่สองคือความสูง ArrayList <Integer> arrayList = new ArrayList <integer> (); ความกว้าง int = bufferedImage.getWidth (); ความสูง int = bufferedImage.getheight (); double scale_w = getDot2Decimal (width_scale, ความกว้าง); System.out.println ("getautowidthandheightscale_w ="+scale_w); double scale_h = getDot2Decimal (height_scale, ความสูง); if (scale_w <scale_h) {arraylist.add (parsedoubleToint (scale_w*width)); arraylist.add (parsedoubleToint (scale_w*ความสูง)); } else {arraylist.add (parsedoubleToint (scale_h*width)); arraylist.add (parsedoubleToint (scale_h*ความสูง)); } return arraylist; }/*** * ส่งคืนการเป็นตัวแทนของทศนิยมสามจุดของตัวเลขสองตัว A/B * @param a * @param b * @return */สาธารณะคงที่ double getDot2Decimal (int a, int b) {bigdecimal bigdecimal_1 = newdecimal (a); bigdecimal bigdecimal_2 = ใหม่ bigdecimal (b); BigDecimal bigDecimal_Result = bigDecimal_1.divide (bigDecimal_2, MathContext ใหม่ (4)); double1 = ใหม่ double (bigdecimal_result.toString ()); System.out.println ("Double After Division คือ:"+double1); กลับสองครั้ง; -