【问题标题】:How do I create a new image by drawing on top of an existing one using Quartz?如何通过使用 Quartz 在现有图像上绘制来创建新图像?
【发布时间】:2009-09-17 10:13:37
【问题描述】:

我有一个带有 uiimageview 的视图我通过相机分配这个 uiimageview 图像..现在我想在图像上做一些绘图..使用 coregraphics.我想做这样的事情...通过触摸和选择一个区域当线条连接圆形或任何形状时画线..我想将该特定区域更改为其他内容,例如将颜色更改为那里.将其变为灰度..直到现在我能够画线...这是一个在 uiimage 视图上绘制的线条图像...

但我无法弄清楚如何在 imageview 的图像上绘制..意思是如何修改 imageview 的图像???

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

当点击裁剪按钮时如何创建一个矩形将矩形移动到屏幕上的任何位置...然后按下按钮裁剪图像...然后保存裁剪后的图像..

【问题讨论】:

    标签: iphone objective-c core-graphics quartz-2d


    【解决方案1】:

    这些是步骤:

    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;
    }
    

    要恢复到旧图像,只需保留对它的引用即可。

    裁剪问题与上述无关,您应该为此创建一个新问题。

    【讨论】:

    • 好的,你的代码很好用。现在告诉我当我使用石英画线时为什么它在实际设备上很慢。还告诉我如何将图像转换为灰度。
    • 您的其他问题应作为新问题发布。
    • 好的,我把它变成灰色。现在有没有办法可以把图像变成别的东西。在上面的图像中,有一个像圆圈这样的选择。我的意思是任何路径跨度>
    • 能否请您详细解释一下您的代码。您真是个天才。
    • 它总是将图像变成灰色。即使我将颜色传递给它。请参阅下面的代码。只是在某些地方更改您的代码。 // 绘制原始图像 CGRect r = CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)); CGContextSetBlendMode(ctx, kCGBlendModeCopy); CGContextDrawImage(ctx, r, image); // 画一些东西 CGRect rect=CGRectMake(50.0, 50.0, 50.0, 50.0); CGContextAddRect(ctx,rect); CGContextSetRGBStrokeColor(ctx, 0.0f, 1.0f, 1.0f, 0.5f); CGContextSetBlendMode(ctx, kCGBlendModeColor); CGContextFillPath(ctx);
    【解决方案2】:

    更简单的解决方案是

    (UIImage *) modifyImage:(UIImage *)inputImage
    {
       UIGraphicsBeginImageContext(inputImage.size);
       [inputImage drawInRect:CGRectMake(0, 0, inputImage.size.width, inputImage.size.height);
       CGContextRef ctx = UIGraphicsGetCurrentContext();
       //Drawing code using above context goes here
       /*
        *
        */
       UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
       return outputImage;
    }
    

    【讨论】:

      【解决方案3】:

      查看Overview of Quartz 2D,了解有关在 iPhone 上使用 Quartz 2D 的信息。

      【讨论】:

      • 我已经阅读了,但仍然无法做到。它非常复杂
      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 2018-03-11
      • 2023-04-02
      • 2010-11-08
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多