Why am I getting a smaller jpg image size when converting from File->BufferedImage->byte[]

General Tech Bugs & Fixes 2 years ago

1 1 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 30 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (1)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

I'm testing different ways to store a jpg file in java and using a ByteArrayInputStream from a buffered image always results in a smaller file size. Is there anyway around this?

So for the whole picture, I'm currently trying to write a client-server image storing program(with eventual editing capabilities, think adobe lightroom). Uploading to the server from the client is no problem, just use Files.readAllBytes(currentFile.toPath()); and vice-versa when downloading to the client from the server, since it's being stored as a file.

The problem is what to do when I want to upload the same image I received(Assuming the image is edited and wanted to be reuploaded to server). I don't have a file created from it so I can't use the readAllBytes functions, they're only stored as an Image Object or BufferedImage. When I write that to a ByteArrayInputStream and get the size of the byte[] array to send back to the server, it's always smaller than the originals.

As a last resort I can make this into an export option so you have to download an image from the server onto the computer before editing, but it would make workflow less efficient.

currentFile = fileChooser.showOpenDialog(window);
            try{

            currentImage = new Image(currentFile.toURI().toString());
            SelectedImageView.setImage(currentImage);
            MainImageLayout.setLeft(SelectedImageView);


            System.out.println("Original file length "+currentFile.length());

                try {
                    BufferedImage bImage = ImageIO.read(currentFile);

                    byte[] fileContent = Files.readAllBytes(currentFile.toPath());
                    System.out.println("bytes from fileContent " +fileContent.length);

                    ByteArrayOutputStream tmp = new ByteArrayOutputStream();
                    ImageIO.write(bImage, "jpg", tmp);
                    tmp.flush();
                    byte[] imageBytes = tmp.toByteArray();
                    tmp.close();
                    long length = imageBytes.length;


                    System.out.println("length of bytearraystream " + length);

Printed Results:
Original file length 196874
bytes from fileContent 196874
length of bytearraystream 117010
1 views
0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.