0

NSMutableArrayをNSdataに変換すると、NSMutableArrayデータがバイト単位で取得されます。 今、UIImageに変換したいのですが、My Arrayデータを電子メールで送信したいからですが、UIImageではnullが返されます。バイトをUIImageに変換する

ここに私のコードです。

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:viewArray]; 
     UIImage *image = [UIImage imageWithData:data]; 
     [controller addAttachmentData:image mimeType:@"image/png" 
      fileName:@"labelData"]; 

答えて

2

あなたはbase64Encoded文字列と背面(例の多くhttp://cocoadev.com/wiki/BaseSixtyFour)へのNSDataを変換する方法を必要とする文字列に画像を変換します。最も簡単なものはNSDataのカテゴリなので、次のようにすることができます。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:viewArray]; 
NSString* pictureDataString = [self base64EncodingWithLineLength:data]; 
UIImage* image = [UIImage imageWithData:[NSData 
     dataFromBase64EncodedString: pictureDataString]]; 
[controller addAttachmentData:image mimeType:@"image/png" 
     fileName:@"labelData"]; 


- (NSString *) base64EncodingWithLineLength:(NSData*) data { 

const unsigned char* bytesArr=[data bytes]; 
unsigned int lineLength=0; 
NSMutableString *result = [NSMutableString stringWithCapacity:[data length]]; 
unsigned long ixtext = 0; 
unsigned long lentext = [data length]; 
long ctremaining = 0; 
unsigned char inbuf[3], outbuf[4]; 
unsigned short i = 0; 
unsigned short charsonline = 0, ctcopy = 0; 
unsigned long ix = 0; 

while(YES) { 
    ctremaining = lentext - ixtext; 
    if(ctremaining <= 0) break; 

    for(i = 0; i < 3; i++) { 
     ix = ixtext + i; 
     if(ix < lentext) inbuf[i] = bytesArr[ix]; 
     else inbuf [i] = 0; 
    } 

    outbuf [0] = (inbuf [0] & 0xFC) >> 2; 
    outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4); 
    outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6); 
    outbuf [3] = inbuf [2] & 0x3F; 
    ctcopy = 4; 

    switch(ctremaining) { 
     case 1: 
      ctcopy = 2; 
      break; 
     case 2: 
      ctcopy = 3; 
      break; 
    } 

    for(i = 0; i < ctcopy; i++) 
     [result appendFormat:@"%c", encodingTable[outbuf[i]]]; 

    for(i = ctcopy; i < 4; i++) 
     [result appendString:@"="]; 

    ixtext += 3; 
    charsonline += 4; 

    if(lineLength > 0) { 
     if(charsonline >= lineLength) { 
      charsonline = 0; 
      [result appendString:@"\n"]; 
     } 
    } 
} 

return [NSString stringWithString:result]; 
} 




static char encodingTable[64] = { 
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; 

この方法を試してみてください。

+0

このメソッドを追加しました。編集したコードで見つけてください。 – Kuldeep

+0

編集したコードを使用してください。何か問題が発生した場合は教えてください – Kuldeep

+0

今はエラーが発生していないので編集していますので、これがうまくいきたいです。実際に私はデモのアプリで毎回これと同じシナリオを複製しており、時にはエラーが発生する理由もあります。 – Kuldeep