你如何在iPhone上绘制单个像素?

时间:2011-02-22 09:52:14

标签: iphone opengl-es core-graphics pixel

我有兴趣制作一个依赖像素,绘画的游戏 每个像素一次一个。

但我很难找到准系统源代码 显示如何做到这一点。一切都必须通过OpenGL吗?

我知道devkit中有一个示例,但是没有绘制1个像素,它绘制了一个大的 圆,我需要1像素映射。

是否存在允许手指简单记录的准系统样本 在屏幕上输入和绘制1个像素?

3 个答案:

答案 0 :(得分:1)

将原始像素绘制到屏幕有两种常用方法:使用OpenGL ES渲染或使用Quartz 2D绘制。两者都有其优点和缺点。

OpenGL ES可以在进行大量显示更新时为您提供最佳的绘图性能。您可以查看Apple的GLPaint sample application,了解如何使用OpenGL ES进行手指驱动绘画。如果需要,您甚至可以将该示例中使用的画笔修改为仅一个像素宽。

但是,使用OpenGL ES可能很复杂,并且需要大量代码才能完成您想要的绘图,即使是2-D。您可以参考问题Learning OpenGL ES 1.x获取资源,以帮助您了解这些API。

对于定期更新的内容,Quartz 2D绘图要慢得多,但它比OpenGL ES更容易接近。 Quartz 2D基于矢量图形,因此它并不是一个逐像素渲染框架。在我对this question的回答中,我给出了关于这个框架的教程的一些建议。

第三种选择,可能不像这两种选择那么简单,就是创建一个UIImage并手动改变其像素以响应绘图操作,在每次更改后重新显示图像。同样,您将遇到与使用Quartz 2D时相同的缓慢性能问题。有关详细信息,请参阅this question中发布的答案。

答案 1 :(得分:0)

为此你需要使用线条绘制功能,因为线条是逐像素绘制的,你可以给出点数,这就是我为你做的。

    UIGraphicsBeginImageContext(self.view.frame.size);
[testImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 12.0, 0.0, 20.0, 14.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 2, 5);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), 2, 5);
CGContextStrokePath(UIGraphicsGetCurrentContext());
testImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


    UIGraphicsBeginImageContext(self.view.frame.size); //you can put here testimage to get the image only
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);

这也会将图像保存在手机的图像库中。 希望这会对你有所帮助。

答案 2 :(得分:0)

Quartz2D很慢。非常慢,特别是在3G和iPod touch 2G等设备上(我说的是差不多1 - 5 fps性能)

OpenGL比iPhone上的Quartz2D更快。

这些是要遵循的步骤

  1. 将投影设置为ortho以匹配屏幕分辨率。 glOrtho的宽度和高度分别为480,320。 (这不是绝对必要的)
  2. 创建一个需要绘制的所有像素的数组。
  3. 确保glPointSize设置为1.0f
  4. 使用GL_POINTS参数调用glDrawArrays。
  5. 您还可以使用颜色缓冲区为每个像素提供不同的颜色。