【问题标题】:Drawing single pixel in Quartz在 Quartz 中绘制单个像素
【发布时间】:2010-05-07 10:55:47
【问题描述】:

我有一个 CGPoints 数组,我想用颜色填充整个屏幕,每个像素的颜色取决于到数组中每个点的总距离。这样做的自然方法是,对于每个像素,计算总距离,并将其转换为颜色。问题如下:

1) 如何在 Quartz 中为单个像素着色?我一直在考虑制作 1 x 1 的矩形。

2) 有没有更好、更有效的方法来达到这种效果?

【问题讨论】:

    标签: iphone quartz-graphics


    【解决方案1】:

    您不需要逐个像素地绘制它。您可以使用径向渐变:

    CGPoint points[count];
    /* set the points */
    
    CGContextSaveGState(context);
    CGContextBeginTransparencyLayer(context, NULL);
    
    CGContextSetAlpha(context, 0.5);
    CGContextSetBlendMode(context, kCGBlendModeXOR);
    CGContextClipToRect(context, myFrame);
    CGFloat radius = myFrame.size.height+myFrame.size.width;
    
    CGColorSpaceRef colorSpace;
    CFArrayRef colors;
    const CGFloat * locations;
    /* create the colors for the gradient */
    
    for(NSUInteger i = 0;i<count;i++){
        CGGradientRef gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceGray(), colors, locations);
        CGContextDrawRadialGradient(context, gradient, points[i], 0.0, points[i], radius, 0);
    }
    
    CGContextSetAlpha(context, 1.0);
    CGContextEndTransparencyLayer(context);
    CGContextRestoreGState(context);
    

    大部分代码都很清楚,但这里有几点:

    • kCGBlendMode 如果两者具有相同的 alpha 且 alpha 不是 1.0,则基本上会添加背景和前景的值。您也可以使用kCGBlendModeColorBurn 而无需使用透明度。检查参考。
    • radius 足够大,可以覆盖整个框架。您可以设置不同的值。
    • 请注意,locations 值应介于 0.0 和 1.0 之间。您需要根据radius 校准您的颜色值。

    【讨论】:

      【解决方案2】:

      以前有人问过这个问题:

      在 Quartz 中,一个 1x1 的矩形可以满足您的需求。但这肯定不是很有效。

      你最好创建一个内存缓冲区,计算你的点距离,然后直接在你的处理循环中写入数组。然后要显示结果,只需创建一个 CGImage 即可将其渲染到屏幕上下文中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2016-05-28
        • 2010-10-20
        • 1970-01-01
        相关资源
        最近更新 更多