如何将十六进制数据转换为UIImage?

时间:2014-03-22 16:44:23

标签: objective-c bitmap uiimage

我喜欢在UIImageView中显示.cpbitmap(它的文件格式化iOS保存壁纸)。问题是我需要转换它。我已经知道如果你得到它的数据(NSData)并转换每一位你得到UIColor,所以第一个比特是R,然后是B,然后是G,然后是G,然后是Alpha(我想)。现在我需要"画"一个UIImage的信息。有谁知道怎么做?

以下是.cpbitmap文件的链接:https://www.dropbox.com/s/s9v4lahixm9cuql/LockBackground.cpbitmap

如果有人可以帮助我真的很酷,

由于

修改 的 我找到了一个有效的python脚本,有人能够将它翻译成Objective

#!/usr/bin/python
from PIL import Image,ImageOps
import struct
import sys
if len(sys.argv) < 3:
    print "Need two args: filename and result_filename\n";
    sys.exit(0)
filename = sys.argv[1]
result_filename = sys.argv[2]

with open(filename) as f:
    contents = f.read()
    unk1, width, height, unk2, unk3, unk4 = struct.unpack('<6i', contents[-24:])
    im = Image.fromstring('RGBA', (width,height), contents, 'raw', 'RGBA', 0, 1)
    r,g,b,a = im.split()
    im = Image.merge('RGBA', (b,g,r,a))
    im.save(result_filename)

1 个答案:

答案 0 :(得分:0)

将RGBA数据转换为图片的基本过程是使用原始数据创建CGDataProviderRef,然后使用CGImageCreate创建CGImageRef,您可以从中轻松生成一个UIImage。所以,这给你的东西:

- (UIImage *) imageForBitmapData:(NSData *)data size:(CGSize)size
{
    void *          bitmapData;
    CGColorSpaceRef colorSpace        = CGColorSpaceCreateDeviceRGB();
    int             bitmapBytesPerRow = (size.width * 4);
    int             bitmapByteCount   = (bitmapBytesPerRow * size.height);

    bitmapData = malloc( bitmapByteCount );
    NSAssert(bitmapData, @"Unable to create buffer");

    [data getBytes:bitmapData length:bitmapByteCount];

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmapData, bitmapByteCount, releasePixels);

    CGImageRef imageRef = CGImageCreate(size.width,
                                        size.height,
                                        8,
                                        32,
                                        bitmapBytesPerRow,
                                        colorSpace,
                                        (CGBitmapInfo)kCGImageAlphaLast,
                                        provider,
                                        NULL,
                                        NO,
                                        kCGRenderingIntentDefault);

    UIImage *image = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpace);
    CGDataProviderRelease(provider);

    return image;
}

releasePixels函数定义如下:

void releasePixels(void *info, const void *data, size_t size)
{
    free((void*)data);
}

唯一的技巧是识别位图的尺寸。有4,142,592字节的图像数据(文件末尾有一些额外的东西,如果你在Xcode中检查十六进制的文件,这是不言而喻的)。这与任何标准设备尺寸无关。但是如果你看一下可能分成4,142,592的可能值,你会得到一些有希望的值(496,522,558,576,696,744,899,928和992)。如果你只是尝试那些,很明显图像是744 x 1392.

然后,您可以使用上述方法使用这些尺寸,然后获得图像。


虽然我根据经验发现了图像的大小,但我注意到这些维度是在文件末尾编码的。这可以通过Python代码确认,它表示图像宽度是上一个UInt32的第五个,高度是最后一个UInt32的第四个。因此,您可以使用上述例程,从文件末尾附近编码的两个32位整数中提取维度:

NSString *path = [[NSBundle mainBundle] pathForResource:@"LockBackground" ofType:@"cpbitmap"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSAssert(data, @"no data found");

UInt32 width;
UInt32 height;
[data getBytes:&width  range:NSMakeRange([data length] - sizeof(UInt32) * 5, sizeof(UInt32))];
[data getBytes:&height range:NSMakeRange([data length] - sizeof(UInt32) * 4, sizeof(UInt32))];

self.imageView.image = [self imageForBitmapData:data size:CGSizeMake(width, height)];