Ich habe jeden Stack-Überlaufposten und Video online durchgesehen und finde keine Lösung, die richtig funktioniert. Im Moment wählt der Benutzer ein Foto aus, das komprimiert werden soll, bevor es in einen AWS S3-Bucket hochgeladen wird. Der Upload funktioniert einwandfrei, aber aus irgendeinem Grund ist das komprimierte Bild größer als das Originalbild! Zum Beispiel, wenn der Benutzer ein 9KB Foto auswählt, wenn ich zu S3 hochlade, ist das Foto 28.5KB. Ich habe versucht ein anderes Foto und es ist 48KB und nach "Kompression" auf S3 seine 378.9KB! (Ich benutze die neueste Softwareversion von allem und kompiliere mit dem Simulator)Wie komprimiere ich Bilder in iOS?
Ich möchte das Originalbild so viel wie ich vor dem Hochladen komprimieren.
Das ist, was ich bisher habe:
Wie ich "komprimieren", um das Bild:
UIImage *compressedProductImage;
NSData *NSproductImage;
NSUInteger productImageSize;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
self.productImage = info[UIImagePickerControllerOriginalImage];
[self.productImageImageView setImage:self.productImage];
[self dismissViewControllerAnimated:YES completion:nil];
NSproductImage = UIImageJPEGRepresentation(self.productImage, 0.5f);
productImageSize = [NSproductImage length];
compressedProductImage = [UIImage imageWithData: NSproductImage];
Wie ich das Foto hochladen:
//Convert product UIImage
NSArray *productImagePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *productImageFilePath = [[productImagePaths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@".png"]];
[UIImagePNGRepresentation(compressedProductImage) writeToFile:productImageFilePath atomically:YES];
NSURL *productImageFileUrl = [NSURL fileURLWithPath:productImageFilePath];
uploadRequest.body = productImageFileUrl;//Needs to be a NSURL
uploadRequest.bucket = AWS_BUCKET_NAME;
uploadRequest.key = productImageKey;
uploadRequest.contentType = @"image/png";
uploadRequest.ACL = AWSS3BucketCannedACLPublicRead;
[[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor] withBlock:^id(AWSTask *task) {
if (task.error != nil) {
NSLog(@"%s %@","Error uploading (product image):", uploadRequest.key);
}else{
NSLog(@"Product image upload completed");
}
return nil;
}];
So sieht es aus wie es entweder zu kompliziert oder nicht lohnt es überhaupt das Bild vor dem Hochladen zu komprimieren. Ich denke, ich werde mich mit den größeren Bildern beschäftigen und dann an einem besseren Caching-System arbeiten, danke für die aufschlussreiche Antwort! –