Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
照片通过Java'存储在Amazon S3存储桶中;s AWS SDK高度增加1像素_Java_Swift_Image_Amazon S3_Base64 - Fatal编程技术网

照片通过Java'存储在Amazon S3存储桶中;s AWS SDK高度增加1像素

照片通过Java'存储在Amazon S3存储桶中;s AWS SDK高度增加1像素,java,swift,image,amazon-s3,base64,Java,Swift,Image,Amazon S3,Base64,我在尝试将图像从Java Web服务器传输到AmazonS3存储桶时遇到了这个奇怪的问题。我正在为Android和iOS(使用Swift)开发一个移动应用程序,允许用户将图像从设备上传到服务器 这些图像(Android的位图和iOS的UIImage)在发送到我的Web服务器(用Java制作,以符合HTTP/1.1标准)之前都转换为Base 64。数据原封不动地到达服务器(这意味着在发送数据之前打印base 64,在数据到达服务器之后,它们是相同的)。从那里我把字符串解码成一个字节数组。我已经隔离

我在尝试将图像从Java Web服务器传输到AmazonS3存储桶时遇到了这个奇怪的问题。我正在为Android和iOS(使用Swift)开发一个移动应用程序,允许用户将图像从设备上传到服务器

这些图像(Android的位图和iOS的UIImage)在发送到我的Web服务器(用Java制作,以符合HTTP/1.1标准)之前都转换为Base 64。数据原封不动地到达服务器(这意味着在发送数据之前打印base 64,在数据到达服务器之后,它们是相同的)。从那里我把字符串解码成一个字节数组。我已经隔离了这个问题,以便与实际发送到AmazonS3存储桶的过程有关。以以下代码段为例:

//image is a byte array, and imageid a String
InputStream is = new ByteArrayInputStream(image);
AmazonS3 s3 = new AmazonS3Client();
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("image/jpeg");
meta.setContentLength(image.length);
s3.putObject(new PutObjectRequest("bucket", "images/" + imageid + ".jpg", is, meta));
这段代码适用于Android,在Android中,图像上传速度为1080x1080,没有任何问题。但是,当我尝试从iPhone上传图像时,分辨率变为1080x1081。对此感到困惑,我决定尝试在本地保存图像,并使用ImageIO将其发送到服务器。奇怪的是,使用:

BufferedImage img = ImageIO.read(new ByteArrayInputStream(image));
File f = new File("image.jpg"); //Removed file creation for brevity
ImageIO.write(img, "jpg", f);
当我在本地图像上使用Imagick的“identify”命令时,输出为:

image.jpg JPEG 1080x1080 1080x1080+0+0 8-bit DirectClass 53.4KB 0.000u 0:00.000
但是,当我从S3存储桶传输图像并执行相同操作时,我得到:

image2.jpg JPEG 1080x1081 1080x1081+0+0 8-bit DirectClass 56.2KB 0.000u 0:00.000
同样,这只发生在从iOS上传时。图像本身仍然有效,打开时不会出现问题。例如:

//image is a byte array, and imageid a String
InputStream is = new ByteArrayInputStream(image);
AmazonS3 s3 = new AmazonS3Client();
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("image/jpeg");
meta.setContentLength(image.length);
s3.putObject(new PutObjectRequest("bucket", "images/" + imageid + ".jpg", is, meta));

(这张照片是在相机面朝下的时候拍摄的,因此这张照片是黑色的)

我怀疑这个问题可能与图像编码到Base 64中的方式不同有关。我使用该库在Android上进行编码,在Web服务器上进行解码,并在swift中使用NSData函数,如下所述:

let imageData = UIImageJPEGRepresentation(normImg, 0.4)
let base64 = NSString(data: imageData!.base64EncodedDataWithOptions(NSDataBase64EncodingOptions(rawValue: 0)), encoding: NSUTF8StringEncoding) as! String
最让我困惑的是~3KB的数据(对于1080个额外像素,每RGB像素3个字节,这是有意义的)是如何突然出现的,以及为什么它似乎与iOS隔离

希望我的问题和调试足够清楚,以便提供尽可能多的信息。如果你需要更多的信息,请告诉我

编辑:刚刚运行了一个测试,并通过命令行将一个1080x1080图像上传到S3存储桶。它还添加了额外的像素

Edit2:决定更改文件上载过程的工作方式。它不再被转换为base 64,UIImage的NSData被转换为字节(UInt8)数组并上传。仍然会导致额外像素的相同结果,这排除了我最初的猜测,即它与base64编码有关。另一方面,安卓系统似乎仍能正常运行,这让我相信,无论出于何种原因,图像的二进制数据都不是完全有效的。我相信EXIF数据在Android和iOS之间的格式是不同的,尽管我不知道这是什么原因造成的