ios Uiimage के लिए zlib संकुचित बेस 64 स्ट्रिंग को कवर करने में समस्या



objective-c base64 (1)

मेरे वर्तमान प्रोजेक्ट में, मुझे बेस 64 स्ट्रिंग को पार्स करना होगा, जो फ्लेक्स (एडोब फ्लैश) एप्लिकेशन द्वारा एन्कोडेड और संग्रहीत है। फ्लेक्स देव टीम के साथ चर्चा करके मुझे पता चला कि वे बिटमैप प्रारूप में छवि स्ट्रिंग संग्रहीत करते हैं, इसलिए मुझे लगता है कि यह एक पिक्सेल प्रतिनिधित्व है।

तो, मुझसे पहले सवाल यह है कि उपर्युक्त मामले में, मैं सीधे कच्चे डेटा को यूआईइमेट में बेस 64 डिकोडिंग क्लास का इस्तेमाल कर सकता हूं या मुझे सीजीबीटीमैप कॉन्टैक्ट का इस्तेमाल करना है?

हालांकि, वर्तमान में मैंने रूपांतरण के लिए उल्लिखित कोड को लागू किया है।

`// 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;

}

यहां एक आउटपुट है, जो एक विकृत छवि है:

तो क्या कोई मुझे बेहतर समाधान बता सकता है या बता सकता है कि मैं सही दिशा में हूं या नहीं? अग्रिम में धन्यवाद :)

संदर्भ के लिए आप मूल आधार 64 स्ट्रिंग पा सकते हैं


छवि को 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];
}




base64