在java中,将映像转换为base64在linux和Windows 10上给出不同的结果

在java中,将映像转换为base64在linux和Windows 10上给出不同的结果,java,arrays,image,base64,Java,Arrays,Image,Base64,我正在尝试从图像中获取base64代码。Windows10中的base64映像没有问题,但在Linux中映像会发生更改。这是我的密码 BufferedImage img = ImageIO.read(file); BufferedImage image = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB); image.createGraphics().drawImage(img, 0,

我正在尝试从图像中获取base64代码。Windows10中的base64映像没有问题,但在Linux中映像会发生更改。这是我的密码

BufferedImage img = ImageIO.read(file);
BufferedImage image = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
image.createGraphics().drawImage(img, 0, 0, Color.WHITE, null);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", baos);
encodedFile = new String(Base64.getEncoder().withoutPadding().encode(baos.toByteArray()), "UTF-8");
在不同的操作系统上,byteArray有不同的结果。 如果java在Linux操作系统上有一个较大的映像(如1920x1080),则映像会发生变化(有些像素会移动,有些像素会出现黄色过滤器)。奇怪的是,它在小图像(602x339)中工作良好。我使用Java8。

在我看来,您的图像与经典的读/写错误一模一样。几年前,我曾经处理损坏的硬盘和存储卡,如果它们有读取错误,它们看起来就是这样。如果使用
FileInputStream
直接读取图像文件,会发生什么情况?如果您只想从中获取BASE64,那么也应该这样做…好的,您可能需要在解码的BASE64上执行映像操作,然后才能显示映像,但这应该是透明的。您是否比较了Windows和Linux上的
encodedFile
?字符串已经不同了吗?如果没有,应该看看你的解码…阅读没有问题,因为当我用这种方式上传这张图片时,没有问题。这张图片看起来像是原图。但是,当我尝试获取Base64格式时,我会遇到这个错误。encodedFile在windows和linux上都是不同的。但是baos.toByteArray()也不同。所以encodedFile是不同的。在我看来,你的图像就像一个经典的读/写错误。几年前,我曾经处理损坏的硬盘和存储卡,如果它们有读取错误,它们看起来就是这样。如果使用
FileInputStream
直接读取图像文件,会发生什么情况?如果您只想从中获取BASE64,那么也应该这样做…好的,您可能需要在解码的BASE64上执行映像操作,然后才能显示映像,但这应该是透明的。您是否比较了Windows和Linux上的
encodedFile
?字符串已经不同了吗?如果没有,应该看看你的解码…阅读没有问题,因为当我用这种方式上传这张图片时,没有问题。这张图片看起来像是原图。但是,当我尝试获取Base64格式时,我会遇到这个错误。encodedFile在windows和linux上都是不同的。但是baos.toByteArray()也不同。所以encodedFile是不同的。