Advanced drawing in Quartz (iOS 4)

本文深入探讨了使用Quartz进行高级绘图的技术,包括如何创建和绘制渐变、图像以及文字。详细介绍了创建颜色空间、定义和绘制线性和径向渐变、使用Core Graphics函数绘制图像以及在图片上绘制文字的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Quartz has a number of advanced capabilities that go beyond simple line drawings. In this section, we’ll look at using gradients, images, and words.

Drawing gradients

Gradients are a core part of SDK design, because they’re a clearly evident aspect of the standard user interface. Unfortunately, there’s no UIKit-level class for creating gradients; instead, you have to fall back on Quartz.

转载:http://blog.youkuaiyun.com/a21064346/article/details/8470332

(网上找到的一篇外文)

点击打开链接

You can create gradients in Quartz in two ways: using a CGShadingRef object or a CGGradientRef object. As is often the case in Core Foundation functions, the difference is in complexity. CGGradientRef allows you to draw simple gradients, and CGShadingRef requires you to define a CGFunctionRef object to precisely calculate how the colors in the gradient are displayed. As you’ve probably guessed, we’ll talk about CGGradientRef here and point you to the Apple class references for CGShadingRef.

Table 13.11 CGColorSpace, CGGradient, and CGContext functions for drawing gradients

Function

Arguments

Summary

CGColorSpaceCreateWithName

color space constant

Creates a color space by name

CGGradientCreateWithColors

color space, color array, location array

Creates a gradient using pregenerated colors

CGGradientCreateWithColorComponents

color space, color components array, location array, color count

Creates a gradient with an array of color parts

CGContextDrawLinearGradient

context, gradient, start CGPoint, end CGPoint, options

Draws a linear gradient

CGContextDrawRadialGradient

context, gradient, start center, start radius, end center, end radius, options

Draws a radial gradient

CGColorSpaceRelease

color space

Frees up a color space object

CGGradientRelease

gradient

Frees up a gradient object

Drawing a gradient is a four-step process:

1 Define the color space, which you usually do by calling CGColorSpaceCreate-DeviceRGB for the iPhone and iPad.

2 Define the gradient by listing colors and where they appear in the gradient, from 0 to 1. You can do this two ways. You can hand off an array of CGColors (which may be useful if you want to generate them using UIColors), or you can hand off a longer array that defines the colors using another method, such as RGBA.

3 Draw the gradient as a linear gradient (going from point to point) or a radial gradient (going from the center to the edge of a circle).

4 Free up the memory.

The following code shows the steps required to draw a three-color linear gradient that spans an entire iPhone screen:


 

 


This code steps through the steps we just listed, defining the color space, creating the parts of the gradient, drawing it, and cleaning up after it. As usual, you can find more info about gradients in the CGGradient reference. For now, though, we’re ready to move on to the next advanced category of Quartz work: images.

Drawing images

In topic 11, you saw one way to work with images, using methods that largely hid the specifics of graphical contexts from you as a programmer. Now that you’re fully immersed in Quartz, you can choose to use the Core Graphics functions instead.

THE IMAGE FUNCTIONS

The two major Core Graphics functions for drawing are listed in table 13.12.

Table 13.12 Two image functions in Quartz

Function

Arguments

Summary

CGContextDrawImage

context, CGRect, image

Draws an image scaled to fit the rectangle

CGContextDrawTiledImage

context, CGRect, image

Draws an image scaled to fit the rectangle but filling the current clip region

These functions both require a CGImageRef, but remember that you can use the CGImage property of a UIImage to produce one. Alternatively, you can use the commands described in the CGImage reference, which offer more precise functionality, to create a new CGImage. Our suggestion is to go with what you know, which means using the UIKit methods, unless they can’t do what you need.

There’s one big gotcha to using the Quartz-related image-drawing functions: they produce a flipped image because they use Quartz’s native coordinate system internally. We’ll show you how to fix that momentarily.

DRAWING ON A BITMAP

Often, you’ll want to turn an image into a bitmap and modify it before displaying it on the screen, most frequently so that you can make multiple uses of the image. We’ll offer a quick example of crossing out a picture here.

Part of what’s unique about this example is that you can do all your drawing work without ever showing the image to the user (unlike if you were drawing on a UIView), thus opening up the possibility of many image-editing functions. When you do decide to display your newly saved image, you’ll see results like the image in figure 13.4.


Figure 13.4 You can change a UIImage without showing it to the user.

The code needed to accomplish this simple crossing out is shown in the next listing.

Listing 13.1 Using bitmaps to edit images


The process of modifying an image involves relatively few steps. You start by creating your bitmap context. Next, you apply any transformations that you want to use for the picture O. If you want to rotate or scale the original picture, here’s where you do it. Likewise, you can use a combination of translations and the context size to easily crop an image. In this example, you flip the picture over by applying a rotation and a translation, to account for the fact that CGContextDrawImage produces an inverted picture. (You’ll see an alternative way to do this in the next example.)

When your transformations are finished, you can draw your image and then draw whatever you want on top of it C (or modify it in some other way). Finally, you save the new picture.

We’ll return to the idea of drawing on pictures in section 13.6 (though we’ll do it in a much more interactive way), but in the meantime we’re ready to draw words.

Drawing words

Unlike Canvas, Quartz supports drawing words on top of your pictures. The functions required are intricate, though, and we generally suggest using UILabel or other UIKit objects and placing them on top of your Quartz objects. But if you need words in Quartz (either because you’re interweaving the words with other Quartz content or because you’re adding words to a picture), you’ll need to use the CGContext text options.

The majority of the text-related functions modify the graphical state, as described in table 13.13. The last two functions in the table draw your text.

You can find several other text-related functions in the CGContext reference. Most notably, if you need more control over your fonts (and particularly if you want to link up to UIFonts), you should use CGContextSetFont and CGContextSetFontSize instead of the CGContextSelectFont function that’s noted here—but keep in mind that you can’t use CGContextShowTextAtPoint when you set your font in this alternative way.

Table 13.13 A variety of functions for drawing text in Quartz

Function

Arguments

Summary

CGContextSelectFont

context, font name, size, text encoding

Sets a font for the graphical state

CGContextSetTextDrawingMode

context,

CGTextDrawingMode

Defines how to draw text in the graphical state

CGContextSetTextMatrix

context, affine transform

Places a transformation matrix in the graphical state for drawing only text

CGContextSetSetPosition

context, x, y

Sets where to draw in the graphical state

CGContextShowText

context, string, length

Draws the text at the current position

CGContextShowTextAtPoint

context, x, y, string, length

Draws the text at the specified position

Here’s a simple example of printing text in Quartz:


The only thing of note is the creation of the affine transformation matrix, flip. We’ve already pointed out that the text-drawing functions don’t use the iOS coordinate system at present. Instead, they’re stored in an inverted manner, so you need to flip them over to use them correctly. (We hope that this changes in some future release of iOS.)

The affine transformation shown here describes the matrix using the CGAffine-TransformMake function. It effectively does the same thing as the two-part transformation in listing 13.1. In our view, it’s a bit simpler but less clear.

That’s only the basics of using text, but it should be enough to get you started when you need to draw in Quartz.

What we didn’t cover

Quartz 2D is a fully featured drawing and painting language that we can only briefly touch on in this topic. Among the other topics you may want to research if you’re going to do more advanced work with Quartz are patterns, transparency layers, layer drawing, and PDF creation. As we’ve mentioned previously, Apple’s "Quartz 2D Programming Guide" is an excellent introduction to these topics.

We’re not quite finished with Quartz. Before we finish this topic, we’ll put together an example that combines some of the Quartz lessons from this topic with some of the photographic work we covered in topic 11.

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值