UIImageをNSDataに変換する


170

私はアプリでこのコードを使用しています。画像を送信するのに役立ちます。

ただし、画像付きの画像ビューがあります。appbundleにファイルはありませんが、画像は私の側にあります。以下のコードをどのように変更できますか?私は変換することができますどのように誰も私を伝えることができるmyimageNSData

// Attach an image to the email
NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];

2
画像のUIImageJPEGRepresentation、UIImagePNGRepresentationリターンNSDataの.....両方
ヒマンシュAgnihotri

回答:


286

画像形式に応じて、次のいずれかを試してください。

UIImageJPEGRepresentation

指定された画像のデータをJPEG形式で返します。

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNGRepresentation

指定された画像のデータをPNG形式で返します。

NSData * UIImagePNGRepresentation (
   UIImage *image
);

ここにドキュメント

編集:

UIImageを構成する生のバイトにアクセスしたい場合は、このアプローチを使用できます。

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

これにより、画像のRGBピクセルの低レベルの表現が得られます。(CFBridgingReleaseARCを使用しない場合は、このビットを省略してください)。


8
すでにある形式でデータを取得する方法はありますか?
devios1 2013

1
Xcodeは、ARC (id)CFBridgingRelease(CGDataProviderCopyData(provider))CDataRef返されたの所有権を取得するために使用することCGDataProviderCopyDataを勧めています。
mostruash 2014年

1
@mostruash:ありがとう、私はあなたの提案を考慮に入れるために私の答えを変更しました。
セルジオ2014年

@sergio非ARC Obj-Cの経験がないので、リリースdataで十分か、それともメモリリークがあるかと思います。
mostruash 2014年

1
これは役に立ちません。プロパティCIImageは、imageWithCIImage:で初期化された場合にのみ設定されます。また、これは直接使用されるデータではなく、別の画像表現オブジェクトです。
King-Wizard

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
私はこの回線を使用していますが、これは非常に遅い
user2128531

5
UIImagePNGRepresentationを使用すると、imageOrlagationなどのimageFlagsが失われることに注意してください。UIImageJPEGRepresentationが推奨されるのはそのためです。
Yony​​、2014年

26

「myImageView」などのUIImageView内に画像がある場合、次の操作を実行できます。

次のように、UIImageJPEGRepresentation()またはUIImagePNGRepresentation()を使用して画像を変換します。

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

このコードをGCDブロック内に配置して別のスレッドで実行し、プロセス中にUIActivityIndi​​catorViewを表示することもできます...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});

24

画像の参照を作成します...

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

画像ビューに画像を表示しています... imagedisplayimageviewのリファレンスです:

imagedisplay.image = rainyImage;

参照をNSData渡すことで変換しUIImage、浮動小数点値で圧縮品質を提供します。

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

Swift 4のソリューション

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

cgImage.dataProviderデータはどのようにエンコードされますか?のデータとは異なるように思わUIImagePNGRepresentationそしてUIImageJPEGRepresentation、そうのような画像を作成するために使用することはできませんのでUIImage(data: imageData)
マヌエル

@Manuelわからない。Sergioの答えから構文を変換したところです。セルジオはおそらくもっとよく知っているでしょう。
Charlton Provatas 2017年

@Manuel CoreGraphics APIを使用しているため、画像よりも低レベルのデータ表現をUIImageJPEGRepresentation提供していると想定しています。ただし、このソリューションでは、画像が含まれていた元のエンコード形式を保持し、再エンコードしないと思います。
Charlton Provatas 2017年

1

関数UIImagePNGRepresentationがオプションの値を返すため、データでif-letブロックを使用して、アプリのクラッシュとコードの安全な実行を防止します。

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

注:データはSwift 3クラスです。Swift 3でNSDataの代わりにDataを使用する

一般的な画像操作(pngとjpgの両方など):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

拡張機能を使用して:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

0
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.