0

我正在学习iOS编程。

我必须处理图像。

我必须将图像制作成 BMP 文件。但iOS不支持制作BMP文件。

所以我想也许我可以使用一个指针来制作 BMP 文件。

我为 BMP 制作了一个标题。并将其放入NSData对象中。

现在我把图像数据保存到那个了NSData。(我会说bmpData)

这里开始我的疑惑。

我必须有尺寸为 128 x 64 的图像。

UIImage从上下文中得到。(我会说image1)

我做了一个CGSize128 x 64的。

我使用该尺寸制作了一个 context2,绘制了一个 image1

现在我UIImage从一个大小为 128 x 64、调整大小的 image1 的 context2 中得到了。

我制作了一个UIImageView并使用了image2,它工作正常。好的。image2 做得很好。

所以我声明了一个指针,它是 unsigned char *。

unsigned char *bmpDataPointer = (unsigned char *)image2;

我用for循环

for(int i = 0; i < 64; ++i)
{
    for(int j = 0 ; j < 128; ++j)
    {
       // dataObj and bmpData are different NSData object
       // dataObj just contain bitmap data to check my pointer works fine or not.
       [dataObj appendBytes:&(bitmapDataPointer[i*1 + j]) length:sizeof(char)];
    }
}

我做了一个UIImage检查数据是否有效,它失败了。

UIImage *createdImageUsedByaPointer = [UIImage imageWithData:dataObj];
if(createdImageUsedByaPointer == nil)
{
  NSLog(@"nil!");
}

好的运行。然后将显示字符串 nil。

这是为什么?我使上下文大小为 128 x 64,所以我循环 128 x 64 次。

但效果不好。

我该如何解决?

我如何处理UIImage使用指针?

任何人都知道,请帮助我。

4

2 回答 2

0

你为什么要这么复杂?

您可以按如下方式创建位图上下文:

CGContextRef context = CGBitmapContextCreate(data, width, height, 
            bitsPerComponent, 
            bytesPerRow, colorSpace, 
            kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);


CGColorSpaceRelease(colorSpace);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *result = [UIImage imageWithCGImage:imageRef];

这里的数据是你的图像NSData

于 2012-07-04T05:13:13.470 回答
0

不知道为什么需要 .bmp 格式,但 ImageMagick 会处理导出。

使用这个 lib ImageMagick for iOS和下面的代码。

UIImage *img9 = [UIImage imageNamed:@"00009_face.jpg"];
MagickWand *bmpWand = NewMagickWand();
NSData *bmpObj = UIImagePNGRepresentation(img9);
MagickSetFormat(bmpWand, "bmp");
MagickReadImageBlob(bmpWand, [bmpObj bytes], [bmpObj length]);

size_t bmp_size;
unsigned char * bmp_image = MagickGetImagesBlob(bmpWand, &bmp_size);
NSData *bmpData = [[[NSData alloc] initWithBytes:bmp_image length:bmp_size] autorelease];
free(bmp_image);
DestroyMagickWand(bmpWand);

NSArray *pathsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentDirectory = [pathsArray objectAtIndex:0];
NSString * bmpPath = [documentDirectory stringByAppendingPathComponent:@"test2.bmp"];
[bmpData writeToFile:bmpPath atomically:NO];

NSLog(@"bmpPath %@", bmpPath);
于 2012-07-04T05:21:52.937 回答