如何使用Quartz在现有图像上绘图来创建新图像?

Rah*_*yas 5 iphone core-graphics objective-c quartz-2d

我有一个视图与uiimageview我通过相机分配这个uiimageview图像..现在我想做一些绘图到图像....使用coregraphics.i希望做这样的事情...通过触摸和绘制线选择一个区域时line加入像圆圈或任何形状的东西..我想将那个特定区域更改为其他东西,例如更改颜色.将其转换为灰度..直到现在我能画线...这里是一个线条的图像绘制在uiimage视图上...

替代文字http://i29.tinypic.com/x5quc6.png

但我无法弄明白我如何在imageview的图像绘制..如何修改imageview的图像???

我还想在点击清除按钮或类似撤消之类的时候恢复图像.有人知道如何实现这一点吗?

如何在单击裁剪按钮时创建矩形在矩阵的任何位置移动矩形...然后按下按钮裁剪图像...然后保存裁剪的图像..

Nik*_*uhe 9

这些是步骤:

  1. 创建与图像的颜色空间和尺寸匹配的CGBitmapContext.
  2. 将图像绘制到该上下文中.
  3. 在图像上绘制您想要的任何内容.
  4. 从上下文创建新图像.
  5. 处理上下文.

这是一个获取图像的方法,在它上面绘制一些东西并返回一个带有修改内容的新UIImage:

- (UIImage*)modifiedImageWithImage:(UIImage*)uiImage
{
    // build context to draw in
    CGImageRef image = uiImage.CGImage;
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(NULL,
                                             CGImageGetWidth(image), CGImageGetHeight(image),
                                             8, CGImageGetWidth(image) * 4,
                                             colorspace, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorspace);

    // draw original image
    CGRect r = CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image));
    CGContextSetBlendMode(ctx, kCGBlendModeCopy);
    CGContextDrawImage(ctx, r, image);
    CGContextSetBlendMode(ctx, kCGBlendModeNormal);

    // draw something
    CGContextAddEllipseInRect(ctx, CGRectInset(r, 10, 10));
    CGContextSetRGBStrokeColor(ctx, 1.0f, 1.0f, 1.0f, 0.5f);
    CGContextSetLineWidth(ctx, 16.0f);
    CGContextDrawPath(ctx, kCGPathStroke);

    CGContextAddEllipseInRect(ctx, CGRectInset(r, 10, 10));
    CGContextSetRGBStrokeColor(ctx, 0.7f, 0.0f, 0.0f, 1.0f);
    CGContextSetLineWidth(ctx, 4.0f);
    CGContextDrawPath(ctx, kCGPathStroke);

    // create resulting image
    image = CGBitmapContextCreateImage(ctx);
    UIImage* newImage = [[[UIImage alloc] initWithCGImage:image] autorelease];
    CGImageRelease(image);
    CGContextRelease(ctx);

    return newImage;
}
Run Code Online (Sandbox Code Playgroud)

要恢复旧图像,只需保留对它的引用.

裁剪的东西与上面的内容无关,你应该为此创建一个新的问题.