将 zlib 压缩的 base64 字符串转换为 Uiimage 的问题

Posted

技术标签:

【中文标题】将 zlib 压缩的 base64 字符串转换为 Uiimage 的问题【英文标题】:Issue in Coverting zlib compressed base 64 string to Uiimage 【发布时间】:2016-09-23 09:35:07 【问题描述】:

在我当前的一个项目中,我必须解析 base 64 字符串,该字符串由 flex(Adobe Flash) 应用程序编码和存储。通过与 flex 开发团队讨论,我发现他们以位图格式存储图像字符串,所以我假设它是像素表示。

所以,我的第一个问题是,在上述情况下,我可以使用 base64 解码类直接将原始数据转换为 UIimage 还是必须使用 CGBitmapContext ?

但是,目前我已经实现了下面提到的转换代码。

` //转换为Base64数据

NSData *decodedData = [QSStrings decodeBase64WithString:_settingSerializedImage.currentValue];


NSError *error = nil;
NSData *unCompressedData = [decodedData bbs_dataByInflatingWithError:&error];



NSData *dataImage = [NSMutableData new];
NSUInteger bytePosition = 0;
uint8_t * bytes =  malloc(5);
[unCompressedData getBytes:&bytes range:NSMakeRange(unCompressedData.length-3, 3)];

bytes = OSSwapBigToHostInt16(bytes);
int width = (int)bytes;

[unCompressedData getBytes:&bytes range:NSMakeRange(unCompressedData.length-5, 5)];

bytes = OSSwapBigToHostInt16(bytes);dataImage = [unCompressedData subdataWithRange:NSMakeRange(0, (unCompressedData.length -5))];

NSUInteger length = [dataImage length];
unsigned char *bytesData = malloc( length * sizeof(unsigned char) ); [dataImage getBytes:bytesData length:length];UIImage *imgScreenShot = [ScreenshotPortlet convertBitmapRGBA8ToUIImage:bytesData withWidth:width withHeight:height];`

以下是使用核心图形转换图像中原始数据的方法

+ (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *) buffer
                            withWidth:(int) width
                           withHeight:(int) height 

 char* rgba = (char*)malloc(width*height*4);
for(int i=0; i < width*height; ++i) 
    rgba[4*i] = buffer[4*i];
    rgba[4*i+1] = buffer[4*i+1];
    rgba[4*i+2] = buffer[4*i+2];
    rgba[4*i+3] = buffer[4*i+3];

//


size_t bufferLength = width * height * 4;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, rgba, bufferLength, NULL);
size_t bitsPerComponent = 8;
size_t bitsPerPixel = 32;
size_t bytesPerRow = 4 * width;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
  if(colorSpaceRef == NULL) 
    NSLog(@"Error allocating color space");
    CGDataProviderRelease(provider);
    return nil;


CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedFirst;

CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef iref = CGImageCreate(width,
                                height,
                                bitsPerComponent,
                                bitsPerPixel,
                                bytesPerRow,
                                colorSpaceRef,
                                bitmapInfo,
                                provider,
                                NULL,
                                YES,
                                renderingIntent);

uint32_t* pixels = (uint32_t*)malloc(bufferLength);

if(pixels == NULL) 
    NSLog(@"Error: Memory not allocated for bitmap");
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpaceRef);
    CGImageRelease(iref);
    return nil;


CGContextRef context = CGBitmapContextCreate(pixels,
                                             width,
                                             height,
                                             bitsPerComponent,
                                             bytesPerRow,
                                             colorSpaceRef,
                                             bitmapInfo);

if(context == NULL) 
    NSLog(@"Error context not created");
    free(pixels);


UIImage *image = nil;
if(context) 

    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), iref);

    CGImageRef imageRef = CGBitmapContextCreateImage(context);

    image = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);
    CGContextRelease(context);


CGColorSpaceRelease(colorSpaceRef);
CGImageRelease(iref);
CGDataProviderRelease(provider);


if(pixels) 
    free(pixels);
   
return image;

Here is the output I'm getting , a distorted image :

那么任何人都可以建议我更好的解决方案或告诉我是否在正确的方向上?谢谢,提前:)

参考here你可以找到原始的base 64字符串

【问题讨论】:

只有方法+ [UIImage imageWithData:] 是的,我也试过了,但是它给了我零图像对象。失败后,我尝试了这个实现。您能否查看我的实施并提出任何建议?无论如何,谢谢。 你能提供原始的base64字符串吗?因为实际上很难判断您现在正在使用哪些数据。可能是图像,可能是压缩图像,可能是 pdf。 感谢您的快速回复,我在我的问题中包含了 base 64 文件链接。请检查 你只需要将base64string解码为uiimage ..? 【参考方案1】:

图片转base64string:

- (NSString *)imageToNSString:(UIImage *)image

    NSData *data = UIImagePNGRepresentation(image);

    return [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

将base64string转换为图像:

- (UIImage *)stringToUIImage:(NSString *)string

    NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];

    return [UIImage imageWithData:data];

【讨论】:

我刚刚尝试过,但它不适合我。它给了我零图像对象。谢谢顺便说一句。 那么你的字符串可能有问题..请帮助自己:) 实际上这个 base 64 字符串是压缩的,所以我使用一些 zlib 库扩展解压缩它。那么应该有与之相关的问题吗? 您能否分享一下您是如何在NSString *object 中获取字符串的,这样我可以看到并帮助您……

以上是关于将 zlib 压缩的 base64 字符串转换为 Uiimage 的问题的主要内容,如果未能解决你的问题,请参考以下文章

VC++使用zlib压缩及解压数据,使用base64编码及解码数据(附源码)

webservice(axis)接口上传文件附件 及 用zlib解压缩

如何将base64加密的字符串转换成image显示在网页上

在 C# 中将 Base64 字节数组解码为图像

怎么把base64的字符串转换为图片后在jQuery的facebox里显示

将 UTF-8 转换为 base64 字符串