2011-04-27 35 views
5

我正在尝试调整CGImageRef的大小,以便可以在屏幕上以我想要的大小绘制它。 所以我有这样的代码:在核心图形中调整图像大小

CGColorSpaceRef colorspace = CGImageGetColorSpace(originalImage); 

CGContextRef context = CGBitmapContextCreate(NULL, 
              CGImageGetWidth(originalImage), 
              CGImageGetHeight(originalImage), 
              CGImageGetBitsPerComponent(originalImage), 
              CGImageGetBytesPerRow(originalImage), 
              colorspace, 
              CGImageGetAlphaInfo(originalImage)); 

if(context == NULL) 
    return nil; 

CGRect clippedRect = CGRectMake(CGContextGetClipBoundingBox(context).origin.x, 
           CGContextGetClipBoundingBox(context).origin.y, 
           toWidth, 
           toHeight); 
CGContextClipToRect(context, clippedRect); 

// draw image to context 
CGContextDrawImage(context, clippedRect, originalImage); 

// extract resulting image from context 
CGImageRef imgRef = CGBitmapContextCreateImage(context); 

所以这段代码可以让我的形象显然是吸取我要的尺寸,这很好。 问题是,即使它在屏幕上调整大小,但实际上没有实际调整大小,我仍然会调整实际图像的大小。当我这样做时:

CGImageGetWidth(imgRef);

它实际上返回图像的原始宽度,而不是我在屏幕上看到的宽度。

那么我怎样才能真正创建一个实际调整大小的图像,而不仅仅是绘制出我想要的尺寸?

谢谢

+1

你只是想*绘制*调整大小,或者你真的想要调整大小吗?你可以做第一个,而不用做第二个(也许它更快) – Robin 2011-04-27 23:17:57

回答

4

问题是,您正在创建与图像大小相同的上下文。您想要使上下文成为新的大小。然后裁剪是不必要的。

试试这个:

CGColorSpaceRef colorspace = CGImageGetColorSpace(originalImage); 

CGContextRef context = CGBitmapContextCreate(NULL, 
              toWidth, // Changed this 
              toHeight, // Changed this 
              CGImageGetBitsPerComponent(originalImage), 
              CGImageGetBytesPerRow(originalImage)/CGImageGetWidth(originalImage)*toWidth, // Changed this 
              colorspace, 
              CGImageGetAlphaInfo(originalImage)); 

if(context == NULL) 
    return nil; 

// Removed clipping code 

// draw image to context 
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), originalImage); 

// extract resulting image from context 
CGImageRef imgRef = CGBitmapContextCreateImage(context); 

我没有实际测试,但它至少应该给你一个什么需要改变的想法。

+0

因为我们在这个话题上,我会为我的UIImage类别[CKImageAdditions](https://github.com/cmkilger/) CKImageAdditions /)。您可以使用-imageWithSize:contentMode :. – 2011-04-28 18:23:28