核心图形环境,它们是什么?

时间:2014-02-15 09:54:49

标签: ios uikit drawing core-graphics quartz-2d

对于StackOverFlow来说,这可能是一个完全不合适的问题,但我不知道还有什么地方可以转过来,已经阅读过一些关于他们的在线内容* ,我一直在理解什么是上下文实际上是。以及它存在的原因,方式和方式。

存在问题,我知道,但我正试图弄清楚这些事情。

/ *是的,包括相关的Apple文档,我读了很多。假设我是愚蠢的,并尝试以一种更简单,更容易理解的方式回答以下关于上下文的问题,甚至可能比技术上混淆的“你只是需要它”的guff和快捷缩写更加有先见之明。所有其他人。如果你不能这样做,那么随意贬低和贬低我的意思。 * /

上下文? 它们中有多少,它们有名称或其他ID,它们可以被分类,变换(旋转,位置,缩放,倾斜和不透明度变化)。他们可以分层,还是以某种方式固定在别的东西上,是孩子还是父母的关系?它们可以链接或嵌套????等等。

我根本就不知道他们是什么。是的,在你提出要求之前,我确实感到愚蠢,因为他们没有立即通过将其称为“上下文”来解决其他人似乎只是“得到”的事情。

我看到我必须借鉴这些事情,如果我不这样做,那就不会发生任何事情,但这可能是对可能的理解,他们为什么以及如何实现以及他们的需要,潜力,由于缺乏更好的术语,实际用途都是看不见的。

对于这些事情,我完全不知所措。

编辑:添加。 以文档为例:

“位图图形上下文接受指向包含位图存储空间的内存缓冲区的指针。当您绘制到位图图形上下文时,缓冲区会更新。释放图形上下文后,您有一个完全更新您指定的像素格式的位图。

好的...发布,并且,(在哪里),可以用这个做什么?它是从哪里发布的?

这是一种最迟钝的说法,即上下文是可以在不直接在屏幕上绘图的情况下绘制的屏幕区域的“假装”表示,然后可以将其映射到屏幕上吗?这是污点吗?在进行全屏视网膜iPad图形绘制时,这是否会占用大量内存?

如果是这样......这个上下文有变换是否有意义?它可以相对于绘制的位置旋转,缩放和重新定位?因此可以重复和轮换吗?

如果它被转换,它的内容如何缩放而没有别名问题。等等。

这是否意味着可以存在多个相同类型的上下文,并且它们可以与不同级别的不透明度和不同的混合模式混合使用?

这些文件似乎只是部分地解释了这件事情。它似乎就在那里,除了我之外,每个人都很容易掌握。

有没有人可以简单地解释它是什么?因为即使是在解释上下文是什么的模糊努力可能会让我走上正确的道路,立即得到所有其余的。

2 个答案:

答案 0 :(得分:2)

CoreGraphics上下文表示绘图状态。它包含诸如当前变换矩阵,要绘制的任何线条的宽度和高度,填充颜色,笔触颜色以及有关计算机应如何绘制内容的一系列其他信息。你可以把它想象成某种C结构(不管它是否是无关的 - 它可能是一个C ++对象,一个Objective-C对象,或者别的东西)。它可能看起来像这样:

struct CGBitmapContext {
    void* bitmapData;
    UInt32 rowBytes;
    float currentTransform [4][4];
    float lineWidth;
    CGColorRef fillColor;
    CGColorRef strokeColor;
    // ... other graphics state needed for drawing ...
};

当您发出要绘制的命令时,例如调用CGContextFillRect(),它会使用该状态来决定绘制的方式和位置。它将使用当前变换矩阵变换您传入的矩形,然后使用填充颜色填充它。

但你没有直接与CGContext打交道。相反,你有一个CGContextRef,它是一个指向上面结构(或对象,或者它实际上是什么)的指针。因此,上下文位于CGContextRef指向的地址。当您调用CGContextRelease()时,如果上下文的保留计数为0,则释放结构或对象或其他内存的内存,可能使用free()delete或{{ 1}}。

您可以拥有适合内存的任何类型的上下文。他们都是独立的。如果您正在使用位图上下文,则释放上下文不一定会释放位图数据。 (我相信这取决于你如何创建上下文。)如果你愿意,你可以使用各种上下文中的数据混合在一起。您可以根据需要制作CGImages,或将它们上传到视频卡以与OpenGL一起使用。你可以随心所欲地做任何事。

在MacOS 9的时代,由于没有上下文,这更令人困惑。每次想要绘制时都必须设置状态。如果你不小心,以前的功能可能会将状态设置为奇怪的状态。如果你没有注意到状态发生了变化,并且没有将其改回你想要的状态,那么绘图看起来会很糟糕。使用上下文,您可以使用-releaseCGContextSaveGState()保存状态并将其还原,例如,您可以使用不同的上下文在同一窗口中绘制到不同的视图。这大大简化了绘图。

答案 1 :(得分:0)

在与一些了解我对事物的隐喻理解的敏感性的好人交谈之后,看来Contexts可能有点像这样:

上下文就像是一种特殊的丝网印刷,用于将图像“打印”到透明塑料高架投影仪纸张上,然后放在框架中,通过高射投影仪呈现给用户。

在这个“隐喻”中,一个视图是一个框架,它拥有一个独特的透明塑料板,塑料板是一个CALayer。

上下文各自与CALayer独特相关,可能最好的想法就像丝网印刷,图像,绘图或其他艺术品可以在我们休闲之前绘制,转移到相关的透明塑料高架投影仪表, CALayer,通过保存它的框架(View)呈现给用户并将其放置在屏幕上。

这种丝网在我们吸入之前可以旋转或以其他方式定位。

因此,通过旋转丝网(上下文)并通过上下文的每个360/12度旋转打印到相同的“位置”,可以完成将时钟面的数字打印在12到11左右的位置。