1

この質問は何度も質問されていることは知っていますが、私の問題は少し異なります。イメージ (shared.image) があり、そのデータをサーバーにアップロードしたいと考えています。これはコードです (img: ビットは、文字列ではなく画像であることをサーバーに知らせるための単なる方法です):

NSString *imageString = [NSString stringWithFormat:@"img:%@", UIImagePNGRepresentation(shared.image)];
NSData *imageData = [imageString dataUsingEncoding:NSUTF8StringEncoding];
[shared.outputStream write:[imageData bytes] maxLength:[imageData length]];

サーバーが (文字列として) 応答するとき、これは別のコードです (shared.array は、パケットの断片化の場合にすべての文字列をグループ化する配列です。img: ビットは削除されます):

string = [shared.imageArray componentsJoinedByString:@""];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
imageView.image = [UIImage imageWithData:data];

[UIImage imageWithData:data] を nslogged すると、nil が返されます。私は何を間違っていますか?

ありがとう

4

2 に答える 2

4

NSStringバイナリデータがあるのに、なぜに往復するのですか? 画像のコンテンツをロードしたい場合は、完全imageDataにバイパスします:NSString

NSData *imageData = UIImagePNGRepresentation(shared.image);

サーバーがバイナリ データを受け入れる場合は、それで十分です。

テキスト文字列が必要な場合は、提案されたコードでは機能しませんが、Base64 などを使用してエンコードする必要があります (例: Matt Gallager の NSData+Base64 カテゴリを使用)。例えば:

NSData *imageData = UIImagePNGRepresentation(shared.image);
NSString *imageString = [NSString stringWithFormat:@"img:\"%@\"", [imageData base64EncodedString]];

応答では、Base64 でエンコードされた文字列を引用符で囲むことをお勧めします。これにより、受信者は Base64 でエンコードされた文字列の末尾を検出できます。参考までに、私はあなたのインターフェースを尊重しようとしましたが、おそらく次のような標準のデータURIスキームimg:を使用することも考えられます:

NSString *imageString = [NSString stringWithFormat:@"img:\"data:image/png;base64,%@\"", [imageData base64EncodedString]];

それはあなた次第です。

サーバーの応答を解析するという点では、これが文字列であるか (この場合、データの Base64 表現である必要があります)、またはバイナリ データであるか (この場合、単に追加する必要があります) の問題です。データをあなたNSMutableDataに送信してから、 を使用するだけimageWithDataです)。

于 2012-12-29T15:26:47.530 に答える
4

IOS >= 7 の場合

- (NSString *)imageToNSString:(UIImage *)image
{
    NSData *imageData = UIImagePNGRepresentation(image);

    return [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}

- (UIImage *)stringToUIImage:(NSString *)string
{
    NSData *data = [[NSData alloc]initWithBase64EncodedString:string
                                                      options:NSDataBase64DecodingIgnoreUnknownCharacters];

    return [UIImage imageWithData:data];
}
于 2014-01-22T11:26:43.767 に答える