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