2017-01-24 1 views
1

このコードを使用して、URLから取得したイメージを64進数に変換しています。Base64の文字列をpngにデコードするとObjective-Cで切り捨てられます

NSURL* imageUrl = [NSURL URLWithString:url]; 
NSData* urlData = [NSData dataWithContentsOfURL:imageUrl]; 
UIImage* uiImage = [UIImage imageWithData: urlData]; 
NSData* imageData = UIImagePNGRepresentation(uiImage); 
NSData* base64 = [imageData base64EncodedDataWithOptions:0]; 
return [NSString stringWithUTF8String:[base64 bytes]]; 

画像URL:https://api.qrserver.com/v1/create-qr-code/?data=somedata&size=220x220&margin=0

生成base64で画像。

iVBORw0KGgoAAAANSUhEUgAAANwAAADcCAMAAAAshD+zAAAABlBMVEX///8AAABVwtN+AAAAHGlET1QAAAACAAAAAAAAAG4AAAAoAAAAbgAAAG4AAASMOw2BmAAABFhJREFUeAHsmdFq5VYQBO3//+lADqgKUZcjpNU6xLNP5e7puVLPTWI2X99/6s9X/WF5uV/Y3/gSH6L3P1vF04lYKRHEnpdTF5dwLnetJr5tEEk0EfZ8LdXFJZyv5bWa9HU7kOQhGbDna6kuLuFv+Vr6+3KVVSCRFLHVp0RwF2cyyXE4Rzci6f6HJuOENrZ25mSKbP/e1Zh5RG861BQP92v3kbu4NhU6DtfkTiOtllPUJnyJILZ2Yu/IcXiXKp+0HiRFpfElgtjaib0jx+FdqnzSepAUlcaXCGJrJ/aOHId3qfJJ60FSVBpfIoitndg7chzepconrQdJUWl8iSC2dmLvyHF4lyqftB4kRaXxJYLY2om9I8fhXap80nqQFJXGlwhiayf2jhyHSaE15SSiiLzEDZLRy0lMZKfs/C+q/MTehAoRR9sRmXm51QWNuRs4fWxRTiKKCEncIJm53OqCwtwNnD62KCcRRYQkbpDMXG51QWHuBk4fW5STiCJCEjdIZi63uqAwdwOnjy3KSUQRIYkbJDOXW11QmLuB08cW5eRGxM5fitL+L14ua8inlwhmXGJixxlNH1uUkxsRey63qqQRVZuYk1ljxiX2pkPNycO991d72pnIetnzcirjX+yaDlXjh2bAt3ow9vzbcnVxVKOvYv91urpL7E2HqsyhGfCtHow9l1tdHNW8fTk+SKR7JDIqO0X5YE7qRdMnLspJxCTFEwnJTlE+mJPzchS0qGtCLTrvOP9MRk6K8sGcnMtR0KKuCbXovOP8Mxk5KcoHc3IuR0GLuibUovOO889k5KQoH8zJuRwFLeqaUIvOO84/k5GTonwwJ3/f5ahhR1T3+Jfc46Ny5+FuwXF4G4sB0vNyqwtK2nXD5HXyTvh6nknSc7n 

このツールを使用して確認したため、イメージが半分になってしまっていました。

http://codebeautify.org/base64-to-image-converter

私は全体のイメージが含まれているbase64image文字列を生成することができますとにかくありますか?

+0

試して提供されたURLに戻って画像に変換され、あなたがいるかどうかを最初に確認することができます取り組んでいます完全な魔道師を得るかどうか。 – vaibhav

答えて

3

。実際にNSLogという文字列が表示され、デバッガで表示されている文字列よりも長いことがわかります。

他の無関係な観測のカップル:

  1. NSDataがnullで終了することはありませんので、あなたが[base64 bytes]stringWithUTF8Stringを使用しないでください。あなたが本当にそれを文字列に変換するために必要な場合は、むしろstringWithUTF8StringよりもinitWithDataを使用したい:

    return [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding]; 
    
  2. 他の人が指摘したように、あなたは完全にbase64NSDataの作成をバイパスし、作成することができます直接文字列:

    return [imageData base64EncodedStringWithOptions:0]; 
    
  3. 私はなぜあなたは、サーバーからNSDataを取り、ラウンド全くUIImageを通してそれをトリップしているかわかりません。あなたは理論的には、単にサーバーから直接データをエンコードすることができます。サーバーは、すでにあなたのPNG表現のNSDataを返して

    NSURL* imageUrl = [NSURL URLWithString:url]; 
    NSData* urlData = [NSData dataWithContentsOfURL:imageUrl]; 
    return [urlData base64EncodedStringWithOptions:0]; 
    

    UIImageUIImagePNGRepresentationはまったく必要ありません。あなたは実際にサーバーがあなたに戻ったものよりもかなり大きいPNGを生成しています。

  4. これは同期ネットワークコールなので、dataWithContentsOfURLを使用することをお勧めします。おそらくNSURLSessionを使用し、これを非同期メソッドに変更する必要があります。

+0

こんにちは!ありがとうございました!確かに正しいです。デバッガは私が生成したbase64をトリミングしています。私はちょうど完全なbase64を得るためにNSLOGを実行する必要があった。さらにポイント番号3は無効です。私もそれを試みましたが、それは私にURL自体のbase64表現を与えました。 – user962206

2

UIImageをbase64文字列に変換するには、このコードを使用します。

NSString *base64String = [UIImagePNGRepresentation(uiImage) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 

ここにコードがあります。

NSURL* imageUrl = [NSURL URLWithString:@"https://api.qrserver.com/v1/create-qr-code/?data=somedata&size=220x220&margin=0"]; 
NSData* urlData = [NSData dataWithContentsOfURL:imageUrl]; 
UIImage* uiImage = [UIImage imageWithData: urlData]; 

NSString *base64String = [UIImagePNGRepresentation(uiImage) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 

NSLog(@"%@",base64String); 

私はhttp://codebeautify.org/base64-to-image-converter

に結果の文字列をチェックするには、それを試してみて、それがお役に立てば幸いです。

+0

私もその1つだけを使用しようとしましたが、それの生成された結果。しかし、これにbase64を貼り付けると。 http://codebeautify.org/base64-to-image-converterイメージのレンダリングに失敗します。ここでbase64 https://gist.github.com/anonymous/d00eb963057bf95a8599f344884683d7 – user962206

+0

あなたのURL plzを共有することができますです。 – Sunny

3
NSURL* imageUrl = [NSURL URLWithString:@"https://api.qrserver.com/v1/create-qr-code/?data=somedata&size=220x220&margin=0"]; 
    NSData *data = [NSData dataWithContentsOfURL:imageUrl]; 
    UIImage *image = [UIImage imageWithData:data]; 
    NSString *base64 = [self encodeToBase64String:image]; 

コード以下のBase64文字列を使用するように画像を変換するには:

- (NSString *)encodeToBase64String:(UIImage *)image { 
    return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
} 

base64ではあなたに完全な画像が得られます。ベース64あなたの与えられた画像ここ

でテストされています:それは切り取らなっている理由は、私はあなたがそれを切り捨てますデバッガでbase64文字列、見ている疑いがあるという点で https://gist.github.com/anonymous/6d76e3ad852b4879ab097e6a1b3e68a2

+0

私はそれの生成された結果を使用しようとしました。しかし、これにbase64を貼り付けると。 http://codebeautify.org/base64-to-image-converterイメージのレンダリングに失敗します。ここにBase64がありますhttps://gist.github.com/anonymous/d00eb963057bf95a8599f344884683d7 – user962206

+0

@ user962206更新された回答を見る私はそのコードを使用し、それは私に完全な画像を与えます –

2

これは完全に

UIImage *img = [UIImage imageNamed:@"QRcode.png"]; 
NSString *base64 = [UIImagePNGRepresentation(img)base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
NSLog(base64); 

印刷Base64文字列を使用すると、エンコード前のImageViewの上の画像を設定することにより、

関連する問題