我喜欢在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)
答案 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)];