Java – Resim fotoğraf sıkıştırma işlemi

Günümüzde sıkıştırma işlemleri için geliştirilmiş bir çok algoritmalar bulunmaktadır.Bu algoritmaların geneline değinmeyeceğiz,bizim ilgileneceğimiz alan resim sıkıştırma işlemi olacaktır.Resim sıkıştırma daha doğrusu medya dediğimiz resim,ses,video sıkıştırma işlemlerinin geneli kayıplı veri sıkıştırma dediğimiz yöntemlerle yapılmaktadır.Örneğin çekmiş olduğumuz bir resim dosyasını sıkıştırmak istediğimizde orijinal halinden farklı olacaktır ve geri getirilemez şekilde kalitede kayıplar olacaktır.Bunlar için farklı şekilde çalışan algoritmalar var bunlara da değinmeyeceğiz Wikipedi üzerinde sınırsız kaynak bulabilirsiniz.Resim sıkıştırmak için yapacağımız işlem elimizdeki görsel veriyi jpeg haline getirmek suretiyle çeşitli oranlar vererek sıkıştırmak olacaktır.Bildiğiniz üzere jpeg sıkıştırılmış resim formatıdır,yani hali hazırda bir sıkıştırma algoritmasına sahiptir ve hemen her platformda desteklenen bir yapıdır.

Aşağıdaki resmimiz sıkıştırılmadan önce jpg formatında ve 160,5 kB (160.494 bytes) boyutundaydı. 0.1 oranında sıkıştırma işlemi yaptığımızda ise jpeg formatında 21,3 kB (21.324 bytes) boyutuna kadar sıkıştırıldı.

pluton orijinal pluton sıkıştırılmış

 

package com.mesutpiskin;

import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFrame;
//Ekstra jar dosyamızı import ediyoruz
import com.sun.media.jai.widget.DisplayJAI;

public class imagecompress {
	/*
	 * Uygulama ilk başlatıldığında imageFİle ile resim dosyasını verilen
	 * dizinden yüklüyoruz ve okuyarak i ye aktarıyoruz. İlk işlem olarak
	 * showimage sınıfı ile sıkıştırma yapmadan resmi gösterip sıkıştırma
	 * işlemini 0.1 oranda yapıyoruz.
	 * 
	 */
	public static void main(String[] args) throws IOException {
		// resim dosyasını yüklüyoruz
		String imageFile = "/home/mesutpiskin/Masaüstü/pluton.jpg";
		BufferedImage i = ImageIO.read(new File(imageFile));
		// ilk olarak orjinal resmi gösterir
		showImage("Original Image", i);
		// Resmi verdiğimiz bir orana göre sıkıştıracağız
		// 0.1 ile 1 arasındaki float bir değer 0.0 a yaklaştıkca sıkıştırma
		// oranını arttıracaktır
		compressAndShow(i, 0.1f);
	}

	public static void compressAndShow(BufferedImage image, float quality) throws IOException {
		// Jpeg formatı için bir imagewriter
		Iterator<ImageWriter> writers = ImageIO.getImageWritersBySuffix("jpeg");
		if (!writers.hasNext())
			throw new IllegalStateException("No writers found");
		ImageWriter writer = (ImageWriter) writers.next();
		// Sıkıştırılan resim için bir ImageParam
		ImageWriteParam param = writer.getDefaultWriteParam();
		param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
		param.setCompressionQuality(quality);

		ByteArrayOutputStream bos = new ByteArrayOutputStream(32768);
		ImageOutputStream ios = ImageIO.createImageOutputStream(bos);
		writer.setOutput(ios);
		writer.write(null, new IIOImage(image, null, null), param);
		ios.flush();
		// ByteArrayOutputStream ile renderimage oluşturuyor
		ByteArrayInputStream in = new ByteArrayInputStream(bos.toByteArray());
		RenderedImage out = ImageIO.read(in);
		int size = bos.toByteArray().length;
		showImage("Sıkıştırıldı,oran: " + quality + ": " + size + " byte", out);
		// SIkıştırdığımız yeni resim dosyamızı uygulamamızın çalıştığı dizine
		// kaydediyor
		File file = new File("compress." + quality + ".jpeg");
		FileImageOutputStream output = new FileImageOutputStream(file);
		writer.setOutput(output);
		writer.write(null, new IIOImage(image, null, null), param);
	}

	/*
	 * Bu metot içerisine verdiğimiz başlık ve resim versini kullanarak JFrame
	 * üzerinde bunu gösterecektir. DisplayJAI kullanabilmek için
	 * jai-core-1.1.3-alpha.jar kütüphanesini eklemeniz gerekmektedir.
	 * 
	 */
	private static void showImage(String title, RenderedImage image) {
		JFrame f = new JFrame(title);
		// Gelen resmi JFrame içerisinde gösteriyoruz
		f.getContentPane().add(new DisplayJAI(image));
		f.pack();
		f.setVisible(true);
		// JFrame kapatıldığında uygulamada kapanacaktır.
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

JAI için gereken jar dosyasını bu adresten indirip projenize ekleyebilirsiniz.Sadece JFrame içerisinde resim göstermek için kullanılmıştır farklı bir bileşenle veya swing kullanarak da görüntüyü işleyebilirsiniz.

 

Kullanılan kaynaklar: