在聊天中分享一张图片,base64 问题

Posted

技术标签:

【中文标题】在聊天中分享一张图片,base64 问题【英文标题】:Share a picture in chat, base64 issue 【发布时间】:2014-10-14 17:30:30 【问题描述】:

我正在开发一个聊天,在聊天中我需要分享图片,我的应用有一个从图库中选择图片的按钮。

这是我的按钮代码:

[upBtn2 addTarget:self action:@selector(uploadImage:) forControlEvents:UIControlEventTouchUpInside];

在图库中,用户可以选择一张图片与其他人聊天分享,对话只是一对一聊天。

这是我的代码。

- (IBAction)uploadImage:(id)sender

    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.mediaTypes = [NSArray arrayWithObjects:
                                (NSString *) kUTTypeImage,
                                nil];
        imagePicker.allowsEditing = NO;
        [self presentViewController:imagePicker animated:YES completion:nil];
        newMedia = NO;
    


-(void)imagePickerControllerDidCancel:
(UIImagePickerController *)picker

    [self dismissViewControllerAnimated:YES completion:nil];


-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info

    NSString *mediaType = [info
                           objectForKey:UIImagePickerControllerMediaType];

    [self dismissViewControllerAnimated:YES completion:nil];

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) 
        UIImage *image = [info
                          objectForKey:UIImagePickerControllerOriginalImage];

        Uploadedimage.image=image;

        if (newMedia)
            UIImageWriteToSavedPhotosAlbum(image,
                                           self,
                                            @selector(image:finishedSavingWithError:contextInfo:),
                                           nil);
    
    else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
    
        // Code here to support video if enabled
    
    UIImage *image = [info
                      objectForKey:UIImagePickerControllerOriginalImage];
    // [self performSelector:@selector(uploadToServer) withObject:nil afterDelay:0.0];
    XMPPMessage *message = [[XMPPMessage alloc] initWithType:XMPP_MESSAGE_TYPE_CHAT to:[self.contact jid]];

    NSData *imageData = UIImagePNGRepresentation(image);
    NSString *imageStr = [GTMBase64 stringByEncodingData:imageData];

    //decoding
    NSData *imageData2 = [GTMBase64 decodeString:imageStr];

    [message addBody:imageStr];

    [[[AppDelegate appDelegate] xmppStream] sendElement:message];

    XMPPJID *myJID = [[[AppDelegate appDelegate] xmppStream] myJID];
    [self addMessage:@
                       XMPP_TIMESTAMP: [NSDate date],
                       XMPP_MESSAGE_USERNAME: [myJID bare],
                       XMPP_MESSAGE_TEXT: imageStr,
                       ];

    [self.tableView reloadData];
    [self scrollToBottom:true];



- (void)image:(UIImage *)image
finishedSavingWithError:(NSError *)error
  contextInfo:(void *)contextInfo

    if (error) 
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle: @"Archivo guardado"
                              message: @"Error al guardar archivo"\
                              delegate: nil
                              cancelButtonTitle:@"Aceptar"
                              otherButtonTitles:nil];
        [alert show];
    

我遇到了一个问题,它显示的代码

2014-10-14 11:01:21.973 Ucity[2907:60b] 消息:( 文本= “/ 9J / 4AAQSkZJRgABAQAAAQABAAD / 4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAE9KADAAQAAAABAAAFcAAAAAD / 2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH / ...” P>

我需要在那里查看图像,但由于某种原因它显示了该文本。

我正在使用 GTMBase 64 库

#import "GTMBase64.h"

谁能帮我解决这个问题?

【问题讨论】:

我正在尝试这个>>当用户选择一个图像时,图像应该出现在聊天中而不是那个文本中,所以我不知道如何做到这一点我找不到任何示例所以我改善 【参考方案1】:

那个神秘的文字图片。它只是图像的 base-64 字符串表示。我假设您出于某种原因进行这种 base-64 编码(例如,您将图像上传到的某些服务需要这种格式)。

我从您的问题推测您想在某处显示图像。我只是想用这段代码来协调它,你在其中检索图像,将其转换为 base-64 字符串,然后丢弃原始图像,现在你问我们为什么你只看到字符串。

如果您再次需要图片,有两种选择:

    保留您在didFinishPickingMediaWithInfo 中抓取的UIImage(或NSData)。

    您也可以将 base-64 字符串转换回 NSData(然后从中创建一个 UIImage)。这是一个相当复杂的方法,但它会起作用。


顺便说一句,如果您愿意,您可以将 GTMBase64.h 替换为 Apple 在 ios 7 中公开的原生 base-64 方法。请参阅 https://***.com/a/19794564/1271826。

另外,我个人不喜欢获取UIImage 并进行PNG 转换以获得NSData。我总是以shown here 获取原始资产。这可确保不会丢失信息,并且生成的 NSData 不会大于所需大小。

【讨论】:

以上是关于在聊天中分享一张图片,base64 问题的主要内容,如果未能解决你的问题,请参考以下文章

base64的图片编码,python如何转存为一张图?

怎么得到图片的base64编码 - 技术问答

怎么得到图片的base64编码 - 技术问答

webpack打包小图片时进行Base64转码

有关java 和 BASE64Decoder的问题

如何在 Dart 中正确下载图片并转换为 base64?