C4保存图像的一部分 [英] C4 saving part of an image
问题描述
嘿, 我浏览了保存图像的示例,之后我只想保存屏幕的一部分. 我设法保存了从图像左上角开始的部分,但实际上我想保存屏幕的中心. 仅保存一部分图像的妙处在于设置具有特定大小的Graphics Context,如下所示:
Hei, I went through the example for saving images and afterwards I wanted to save only a part of the screen. I managed to save the part starting at the upper left corner of the image but I actually want to save the center of my screen. The magic to save only a part of an image is setting up the Graphics Context with a certain size, like this:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 300), YES, 5.0f);
我认为可能有一种使用CGRect而不是大小的方法,但这给了我一个错误.还有其他尝试或想法吗?我是否必须浏览屏幕快照的像素,获取所需的像素并从中获得新图像(那是我能想到的一种复杂方式,但也许有一种更简单的方式)?
I thought there might be a way to use a CGRect instead of the size, but that gives me an error. any other attempts or thoughts? Do I have to go through the pixels of my screenshot, grab those needed and make a new image out of that (that would be the kind of complicated way I can think of but maybe there is an easier one)?
推荐答案
要对C4Image对象执行此操作,可以将incmiko的答案修改为如下所示:
To do this with C4Image objects, you can modify incmiko's answer to look like the following:
#import "C4Workspace.h"
@implementation C4WorkSpace{
C4Image *image;
C4Image *croppedImage;
}
-(void)setup {
image=[C4Image imageNamed:@"C4Sky.png"];
image.origin=CGPointMake(0, 20);
croppedImage = [self cropImage:image toArea:CGRectMake(150,50,100,100)];
croppedImage.origin = CGPointMake(20, 360);
[self.canvas addObjects:@[image,croppedImage]];
}
-(C4Image *)cropImage:(C4Image *)originalImage toArea:(CGRect)rect{
//grab the image scale
CGFloat scale = originalImage.UIImage.scale;
//begin an image context
UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);
//create a new context ref
CGContextRef c = UIGraphicsGetCurrentContext();
//shift BACKWARDS in both directions because this moves the image
//the area to crop shifts INTO: (0, 0, rect.size.width, rect.size.height)
CGContextTranslateCTM(c, -rect.origin.x, -rect.origin.y);
//render the original image into the context
[originalImage renderInContext:c];
//grab a UIImage from the context
UIImage *newUIImage = UIGraphicsGetImageFromCurrentImageContext();
//end the image context
UIGraphicsEndImageContext();
//create a new C4Image
C4Image *newImage = [C4Image imageWithUIImage:newUIImage];
//return the new image
return newImage;
}
@end
除了代码中的注释外,还需要注意其他几件事:
Aside from the comments in the code there are a couple other things to be aware of:
-
您正在裁剪的区域"将始终参考您正在裁剪的图像".因此,如果您想从图像中裁剪
{150,50}
,并且图像的原点位于{20,20}
,那么它将看起来就像您正在从CANVAS中裁剪{170,70}
一样.
The "area" you're cropping will always be in reference to the "image" that you're cropping. So, if you want to crop
{150,50}
from the image, and the image's origin is at{20,20}
then it will LOOK like you are cropping{170,70}
from the CANVAS.
C4Image
对象实际上有一个renderInContext:
方法,因此您不必从图像层执行此操作.
The C4Image
object actually has a renderInContext:
method, so you don't have to do this from the image's layer.
C4Image
对象 wrap UIImage
对象,这就是为什么我们使用从当前上下文获得的UIImage
构建新对象的原因
C4Image
objects wrap UIImage
objects, which is why we build a new one using the UIImage
that we get from the current context
这篇关于C4保存图像的一部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!