Java DIP - เทคนิคการบีบอัดภาพ
ภาพสามารถบีบอัดและจัดเก็บผ่าน Java ได้อย่างง่ายดาย การบีบอัดภาพเกี่ยวข้องกับการแปลงภาพเป็น jpg และจัดเก็บ
ในการบีบอัดภาพเราจะอ่านภาพและแปลงเป็นวัตถุ BufferedImage
นอกจากนี้เราได้รับ ImageWriter จาก getImageWritersByFormatName()วิธีการที่พบในคลาส ImageIO จาก ImageWriter นี้ให้สร้างไฟล์ImageWriteParamวัตถุ. ไวยากรณ์ได้รับด้านล่าง -
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
จากออบเจ็กต์ ImageWriteParam นี้คุณสามารถตั้งค่าการบีบอัดโดยเรียกสองวิธีการนี้ซึ่งก็คือ setCompressionMode() และ setCompressionQuality(). ไวยากรณ์ของพวกเขามีดังต่อไปนี้ -
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
เมธอด setCompressionMode () ใช้ Mode_EXPLICIT เป็นพารามิเตอร์ โหมดอื่น ๆ บางส่วนจะอธิบายสั้น ๆ -
ซีเนียร์ | โหมด |
---|---|
1 |
MODE_DEFAULT เป็นค่าคงที่ที่อาจส่งผ่านไปยังวิธีการเพื่อเปิดใช้งานคุณลักษณะนั้นสำหรับการเขียนในอนาคต |
2 |
MODE_DISABLED เป็นค่าคงที่ที่อาจส่งผ่านไปยังเมธอดเพื่อปิดใช้งานคุณลักษณะนั้นสำหรับการเขียนในอนาคต |
3 |
MODE_EXPLICIT เป็นค่าคงที่ที่อาจส่งผ่านไปยังวิธีการเพื่อเปิดใช้งานคุณลักษณะนั้นสำหรับการเขียนในอนาคต |
นอกเหนือจากวิธีการบีบอัดแล้วยังมีวิธีการอื่น ๆ ที่จัดเตรียมโดยคลาส ImageWriteParam มีการอธิบายสั้น ๆ -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 |
canOffsetTiles() จะคืนค่าจริงหากผู้เขียนสามารถทำการเรียงไทล์โดยมีการชดเชยกริดที่ไม่ใช่ศูนย์ขณะเขียน |
2 |
getBitRate(float quality) ส่งคืนค่าลอยที่ระบุจำนวนบิตของข้อมูลเอาต์พุตโดยประมาณสำหรับข้อมูลภาพอินพุตแต่ละบิตในระดับคุณภาพที่กำหนด |
3 |
getLocale() จะส่งคืน Locale ที่ตั้งไว้ในปัจจุบันหรือ null หากรองรับเฉพาะ Locale เริ่มต้น |
4 |
isCompressionLossless() จะคืนค่าเป็นจริงหากประเภทการบีบอัดปัจจุบันให้การบีบอัดแบบไม่สูญเสีย |
5 |
unsetCompression() จะลบประเภทการบีบอัดและการตั้งค่าคุณภาพก่อนหน้านี้ |
6 |
unsetTiling() จะลบพารามิเตอร์ตารางไทล์ก่อนหน้าใด ๆ ที่ระบุโดยการเรียกใช้ setTiling |
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คลาส ImageWriteParam เพื่อบีบอัดรูปภาพ -
import java.io.*;
import java.util.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.imageio.stream.ImageOutputStream;
class Compression {
public static void main(String[] args) throws IOException {
File input = new File("digital_image_processing.jpg");
BufferedImage image = ImageIO.read(input);
File compressedImageFile = new File("compress.jpg");
OutputStream os =new FileOutputStream(compressedImageFile);
Iterator<ImageWriter>writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.05f);
writer.write(null, new IIOImage(image, null, null), param);
os.close();
ios.close();
writer.dispose();
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดมันจะบีบอัดรูปภาพ digital_image_processing.jpg ให้เทียบเท่ากับอิมเมจที่บีบอัดและเขียนลงในฮาร์ดดิสก์ด้วยชื่อ compress.jpg.