0

Hi i am writing a code in java to compress an image file without zipping it but all that i have been able to do is to zip the file.

This is my code.

package com.test.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Main {

    public static final double byteSize = 1024;
    public static final String successDir = "E://Tmp/S";
    public static final String failureDir = "E://Tmp/F";
    public static final String tempDir = "E://Tmp/T";
    public static final String delimiter = "/";
    public static final String zipExtn = ".zip";
    public static final String filePath = "E://Tmp/_LND4320HR1.bmp";

    public static void main(String[] args) {
        double fileSizeInMB = 0.0;
        File inputFile = null;
        try {
            inputFile = new File(filePath);
            if (inputFile.exists()) {
                fileSizeInMB = ((inputFile.length() / (byteSize)) / (byteSize));
                if (fileSizeInMB < 6) {
                    writeToDir(inputFile,successDir);
                    System.out.println("Done");
                } else {

                    //Compress file
                    compressFile(inputFile);

                    inputFile =  new File(tempDir + delimiter
                            + getFileName(inputFile.getName())+ zipExtn);
                    if(inputFile.exists()){
                        fileSizeInMB = ((inputFile.length() / byteSize) / byteSize);
                        if (fileSizeInMB < 6) {
                            writeToDir(inputFile,successDir);
                            System.out.println("Done");
                        }else{
                            writeToDir(inputFile,failureDir);
                            System.out.println("Not Done");
                        }
                    }
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String getFileName(String fileName) {
        int indexofDot = fileName.lastIndexOf(".");
        return fileName.substring(0,indexofDot);
    }

    public static void writeToDir(File inputFile,String dirPath) throws IOException{
        byte[] buffer = new byte[1024];
        FileOutputStream fos = new FileOutputStream(dirPath + delimiter
                + getFileName(inputFile.getName()) + zipExtn);
        FileInputStream fis = new FileInputStream(inputFile);
        int length;

        while ((length = fis.read(buffer)) > 0) {
            fos.write(buffer, 0, length);
        }
        //Closing operations
        fis.close();
        fos.close();
    }
    public static void compressFile(File inputFile) throws IOException{
        byte[] buffer = new byte[1024];

        FileOutputStream fos = new FileOutputStream(tempDir + delimiter
                + getFileName(inputFile.getName())+ zipExtn);
        ZipOutputStream zos = new ZipOutputStream(fos);
        ZipEntry ze = new ZipEntry(inputFile.getName());
        zos.putNextEntry(ze);
        FileInputStream fis = new FileInputStream(inputFile);
        int length;
        while ((length = fis.read(buffer)) > 0) {
            zos.write(buffer, 0, length);
        }
        //Closing operations
        zos.closeEntry();
        zos.close();
        fis.close();
        fos.close();
    }


}

The above code only zips the file how to convert this code to compress but not zip the file.

user1844638
  • 1,067
  • 3
  • 23
  • 48
  • lossy compression / lossless ? – Raptor Jun 04 '13 at 06:08
  • any thing i just need to convert the above after compression if the image file is above 6mb i need to store it to failure folder and if below 6mb need to store it in success folder and i need to be able to open and view the compressed file. – user1844638 Jun 04 '13 at 06:10
  • [ImageIO](http://docs.oracle.com/javase/6/docs/api/javax/imageio/ImageIO.html) has methods to allow you to save images as png or jpg – BevynQ Jun 04 '13 at 06:13
  • i know but i am not a java programmer this is the 1st time i am doing it and i dunno how to implement it – user1844638 Jun 04 '13 at 06:17
  • Convert it to JPEG (best compression, lose information) or PNG (reasonable compression, do not lose information). BMPs are typically uncompressed. – Thorbjørn Ravn Andersen Jun 04 '13 at 06:31
  • i don't want to compress it i just want to reduce the size of the file – user1844638 Jun 04 '13 at 06:32

1 Answers1

1

this program will change size of image without compressing it.

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageTest {

    private static final int IMG_WIDTH = 512;
    private static final int IMG_CLAHEIGHT = 512;

    public static void main(String[] args) {
        String filePath = "e:\\Image_DCM_PNG\\";
        try {

            File myFile = new File(filePath);
            File roots[] = myFile.listFiles();
            for (int i = 0; i < roots.length; i++) {
                System.out.println(roots[i]);
                BufferedImage originalImage = ImageIO.read(new File(filePath + roots[i].getName()));
                int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();

                BufferedImage resizeImageBmp = resizeImage(originalImage, type);
                ImageIO.write(resizeImageBmp, "png", new File(filePath + roots[i].getName()));
            }

        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    private static BufferedImage resizeImage(BufferedImage originalImage, int type) {
        BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_CLAHEIGHT, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_CLAHEIGHT, null);
        g.dispose();
        return resizedImage;
    }

    private static BufferedImage resizeImageWithHint(BufferedImage originalImage, int type) {

        BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_CLAHEIGHT, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_CLAHEIGHT, null);
        g.dispose();
        g.setComposite(AlphaComposite.Src);

        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        return resizedImage;
    }
}
Mayank Tiwari
  • 2,974
  • 5
  • 30
  • 52