从File-> BufferedImage-> byte []转换时,为什么得到较小的jpg图像大小

时间:2019-04-05 04:58:07

标签: java javafx

我正在测试以其他方式在Java中存储jpg文件的方法,并且使用缓冲图像中的ByteArrayInputStream总是会减小文件大小。反正还有吗?

因此,对于整个图片,我目前正在尝试编写一个客户端-服务器图像存储程序(具有最终的编辑功能,请考虑使用Adobe Lightroom)。从客户端上载到服务器没有问题,从服务器上下载到客户端时,只需使用Files.readAllBytes(currentFile.toPath());,反之亦然,因为它是作为文件存储的。

问题是当我要上载收到的相同图像时该怎么做(假设该图像已被编辑并想要重新上传到服务器)。我没有从中创建文件,因此无法使用readAllBytes函数,它们仅存储为Image Object或BufferedImage。当我将其写入ByteArrayInputStream并获得byte[]数组的大小以发送回服务器时,它总是小于原始数组。

作为最后的手段,我可​​以将其设置为导出选项,因此您必须在编辑之前将图像从服务器下载到计算机上,但这会使工作流程效率降低。

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

0 个答案:

没有答案