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.

ภาพต้นฉบับ

ภาพบีบอัด - ปัจจัยด้านคุณภาพ - 0.05

ภาพบีบอัด - ปัจจัยด้านคุณภาพ - 0.5