如何用新的上下文绘制小尺寸的大图像?

时间:2014-11-28 07:17:54

标签: ios objective-c iphone xcode image

![在此处输入图像说明] [1]通过使用下面的代码,我能够以小的形式绘制一个大图像,但新的一个图像有他们的超级视图上下文或其他其他单词新图像显示在中心新的image但是有一个大的白色背景来掩盖大图像尺寸。

因此,实际图像大小与大图像相同,但我想删除多余的空白区域。

  UIGraphicsBeginImageContextWithOptions(largeImage.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor clearColor] setFill];
    CGContextSetLineWidth(context, 4.0);
    CGContextSetStrokeColorWithColor(context,
                                     [UIColor clearColor].CGColor);
    CGRect rectangle = CGRectMake((largeImage.size.width-80)/2, (largeImage.size.height-60)/2, 60, 80);
    CGContextAddEllipseInRect(context, rectangle);
    CGContextStrokePath(context);
    [largeImage drawInRect:rectangle];

    UIImage *smallSizeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

最后,我得到了很多白色背景的smallSizeimage。我想改变他们的白色背景而不会失去图像质量。 请指导我..

2 个答案:

答案 0 :(得分:0)

替换此

  UIGraphicsBeginImageContextWithOptions(largeImage.size, NO, 0);

用这个:

  UIGraphicsBeginImageContextWithOptions(small.size, NO, 0);

此处它是一种我调用图像调整大小的方法:

- (UIImage*)imageWithImage:(UIImage*)image
{

CGSize newSize=CGSizeMake(100, 100);

UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return newImage;
}

答案 1 :(得分:0)

您的过程配合过于复杂。

我将在下面发布您的问题的解释,
由于我不是母语为英语的人,如果我的一些解释并不清楚,请告诉我,我会尝试对它们进行改写。
如果您只对一个正常工作的代码感兴趣,而不做任何解释,只需滚动到底部即可。

首先,您的主要问题是以下两个:
UIGraphicsBeginImageContextWithOptions(largeImage.size, NO, 0);[largeImage drawInRect:rectangle];

UIGraphicsBeginImageContextWithOptions中,您可以设置您感兴趣的新图形上下文,即新图像大小,而不是大图像,就像您在示例中所做的那样。

其次,UIImage实例方法[yourImage drawInRect:yourRect位于图形上下文的坐标系中,而不是视图的坐标系。
这意味着,您可以将其视为一个从(0, 0)开始并且是图像大小的矩形。

在向您解释您所犯的错误后,我会发布2种不同的代码。
一种是从原始图像中制作一个小图像,您将在一秒钟内看到一个简单过程的多少。
第二个是上面代码的修改版本,因为我不知道你使用它的是什么,可能是你需要使用原始代码中的其他一些东西。

调整图片大小:

CGSize newSize = CGSizeMake(60,80); // Our new image size  
CGRect newRect = CGRectMake(0, 0, 60, 80); // Our 'work' rect in out image context
// Begin a new image context with the new size we want
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);  
// Draw our image to our new rect  
[largeImage drawInRect:newRect];  
// Create a new UIImage from our new context  
UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();  
// End our image context  
UIGraphicsEndImageContext();  

那就是它!

如果你仍然需要使用原始代码中的一些内容,以下是它的修改版本:

CGSize newSize = CGSizeMake(60, 80);  
CGRect newRect = CGRectMake(0, 0, 60, 80);  
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);  
CGContextRef context = UIGraphicsGetCurrentContext();  
[[UIColor clearColor] setFill];  
CGContextSetLineWidth(context, 4.0);
CGContextSetStrokeColorWithColor(context,
                                 [UIColor clearColor].CGColor);
CGContextAddEllipseInRect(context, newRect);
CGContextClip(context); // EDIT- this is what we were missing
CGContextStrokePath(context);
[largeImage drawInRect:newRect];
UIImage *smallSizeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();  
祝你好运!

编辑 - 查看上面的代码进行编辑 基本上,你和我在你的代码中都错过了什么,即使你使用CGContextAddEllipseInRect()创建一个圆形的上下文,我们也没有打电话给CGContextClip()实际上&# 39;限幅'椭圆形的背景。
现在,您的图片应该被舍入'。