現在、iOSのImgurを使用して、次のコードでサーバーに画像をアップロードしています。
NSData* imageData = UIImagePNGRepresentation(image);
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* fullPathToFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"SBTempImage.png"];
[imageData writeToFile:fullPathToFile atomically:NO];
[uploadRequest setFile:fullPathToFile forKey:@"image"];
高速イーサネット接続を使用しているため、シミュレータで実行し、シミュレータの写真ライブラリからファイルをアップロードすると、コードは正常に機能します。ただし、iPhoneで撮影した画像を選択すると、iPhoneで同じコードがタイムアウトします。そこで、ウェブから小さな画像を保存してアップロードしようと試みましたが、うまくいきました。
これは、iPhoneで撮影された大きな画像がやや遅い3Gネットワーク上でタイムアウトになっていると思うようになります。送信する前にiPhoneの画像を圧縮/サイズ変更する方法はありますか?
このスニペットは画像のサイズを変更します:
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
変数newSize
はCGSize
であり、次のように定義できます。
CGSize newSize = CGSizeMake(100.0f, 100.0f);
自己完結型のソリューション:
- (UIImage *)compressForUpload:(UIImage *)original scale:(CGFloat)scale
{
// Calculate new size given scale factor.
CGSize originalSize = original.size;
CGSize newSize = CGSizeMake(originalSize.width * scale, originalSize.height * scale);
// Scale the original image to match the new size.
UIGraphicsBeginImageContext(newSize);
[original drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *compressedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImage;
}
@Tuan Nguyenに感謝します。
@Tuan Nguyenを補完するために、これはおそらく最速で最もエレガントな方法です。
iphonedevelopertips.comのJohn Muchowの投稿 にリンクするには、UIImageにカテゴリを追加すると、非常に高速にスケーリングする非常に便利な方法です。ただ電話する
UIImage *_image = [[[UIImage alloc] initWithData:SOME_NSDATA] scaleToSize:CGSizeMake(640.0,480.0)];
nSDATAの640x480の表現イメージ(オンラインイメージの場合もあります)を、コードを追加することなく返します。
Matt Gemmellの MGImageUtilities は非常に優れており、効率的にサイズを変更し、いくつかの労力を削減する方法があります。
このコードでは、0.5は50%を意味します...
UIImage *original = image;
UIImage *compressedImage = UIImageJPEGRepresentation(original, 0.5f);
この単純なメソッドNSData *data = UIImageJPEGRepresentation(chosenImage, 0.2f);
を使用します
Zorayrの関数の迅速な実装(実際の単位はスケーリングではなく、高さまたは幅の制約を含めるために少し変更されています):
class func compressForUpload(original:UIImage, withHeightLimit heightLimit:CGFloat, andWidthLimit widthLimit:CGFloat)->UIImage{
let originalSize = original.size
var newSize = originalSize
if originalSize.width > widthLimit && originalSize.width > originalSize.height {
newSize.width = widthLimit
newSize.height = originalSize.height*(widthLimit/originalSize.width)
}else if originalSize.height > heightLimit && originalSize.height > originalSize.width {
newSize.height = heightLimit
newSize.width = originalSize.width*(heightLimit/originalSize.height)
}
// Scale the original image to match the new size.
UIGraphicsBeginImageContext(newSize)
original.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let compressedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImage
}
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
+ (UIImage *)resizeImage:(UIImage *)image toResolution:(int)resolution {
NSData *imageData = UIImagePNGRepresentation(image);
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CFDictionaryRef options = (__bridge CFDictionaryRef) @{
(id) kCGImageSourceCreateThumbnailWithTransform : @YES,
(id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
(id) kCGImageSourceThumbnailMaxPixelSize : @(resolution)
};
CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options);
CFRelease(src);
UIImage *img = [[UIImage alloc]initWithCGImage:thumbnail];
return img;
}
UIImage *image = [UIImage imageNamed:@"image.png"];
NSData *imgData1 = UIImageJPEGRepresentation(image, 1);
NSLog(@"Original --- Size of Image(bytes):%d",[imgData1 length]);
NSData *imgData2 = UIImageJPEGRepresentation(image, 0.5);
NSLog(@"After --- Size of Image(bytes):%d",[imgData2 length]);
image = [UIImage imageWithData:imgData2];
imgTest.image = image;
スケーリング係数によってJPGを変換してみてください。ここでは、0.5を使用しています。私の場合:オリジナル---画像のサイズ(バイト):85KB以降---画像のサイズ(バイト):23KB
Jagandeep SinghメソッドのSwift 2.0バージョンですが、NSDataのためにデータを画像に変換する必要がありますか? UIImageは自動的に変換されません。
let orginalImage:UIImage = image
let compressedData = UIImageJPEGRepresentation(orginalImage, 0.5)
let compressedImage = UIImage(data: compressedData!)
NsData *data=UiImageJPEGRepresentation(Img.image,0.2f);