Cocoa China 苹果开发中文站

苹果Mac OS X开发 iPhone开发 Cocoa以及Cocoa Touch

推荐使用Safari浏览器阅读本站

Cocoa图形

使NSImage支持在图片上添加倒影效果

Mac上一直比较流行的图片设计思路是在一个图片上面增加一个倒影,使其看起来的感觉像是放在一个透明的桌子上。最流行的就是iTunes中的CoverFlow。这个思路后来也被众多的Web 2.0公司的Logo设计者们普遍使用。

NSImage Reflection这段小代码是NSImage的category,专门用来在图片上添加倒影。你可以直接用它在图片上添加倒影效果。

代码可以在这里下载,用法也非常简单:

因为这个代码扩展了NSImage,所以要在某个NSImage图片上添加倒影,只需要使用[NSImage reflectedImage: amountReflected:]方法就可以了。很容易看明白,reflectedImage参数直接带上一个NSImage图片,amountReflected参数则是倒影的深度,用浮点数表示。

另外,代码使用了CTGradient类,如果你只想在Leopard中使用,也可以改改代码,直接使用NSGradient就可以了。

 

iTunes提供了新的CoverFlow效果,其中自带了一个动画形式的滚动条,完全不同于以往苹果的滚动条形式。你也可以在Leopard的Finder里找到这种动画形式的滚动条。

本文介绍如何创建这种滚动条,以便你可以在自己建立的CALayer中方便地添加。这篇文章的例子还可以做为很好的Core Animation教学供你参考。

点击这里阅读全文 »

Core Animation教学:如何使用CALayer的遮罩(mask)

在Core Animation的层中使用遮罩使图片的某些部分变为透明是非常简单的事情,你只需要建立一个遮罩层,设置为另一个层的mask即可。相关信息在本站的 Core Animation:用最少代码画出照片倒影效果 中有所提及。只是之前例子中的遮罩是使用Photoshop进行创建的。

本文通过一个简单例子,直接创建一个CGImageRef图片做为遮罩,继续讲解如何在Core Animation中使用遮罩。

点击这里阅读全文 »

如何用Cocoa通过CGrafPtr画图

苹果的一些插件API,如Webkit插件、iTunes可视化插件(SDK)等,提供的图形上下文指针都是CGrafPtr这种类型。那么如果想用Cocoa在其中画图,可以参考如下代码:

  //destPort CGrafPtr

CGContextRef cgContext;

OSStatus err = QDBeginCGContext(destPort, &cgContext);

if(err == noErr)

{

[NSGraphicsContext saveGraphicsState];


[NSGraphicsContext setCurrentContext: [NSGraphicsContext  

  graphicsContextWithGraphicsPort: cgContext flipped: NO];

 

/* 在这里就可以画了 */

 

[NSGraphicsContext restoreGraphicsState];

 

QDEndCGContext(destPort, &cgContext);

}

 

 

一些源代码资源下载

今天介绍一些比较有用的源代码,你既可以把它们做为例子学习,也可以直接在你的项目里使用。

这些例子包括一个Core Animation文档中提及的动画菜单,一个高级点的Core Animation例子,一个Http服务器的例子以及一个如何设置“偏好设置”窗口的例子。希望对大家有用。

 

点击这里阅读全文 »

Quartz Composer完全入门(2)

在Quartz Composer完全入门第一部分中,我们讲解了如何导入图片,如何使用Billboard、LFO以及简单的例子系统。第二部分将继续通过青蛙的例子深入讲解Quartz Composer,并给出几个有趣的粒子系统的使用实例。

点击这里阅读全文 »

解决JPG文件和NSImage分辨率不同的问题

某些情况下,NSImage加载的JPG文件的尺寸会显示的很奇怪,这主要是图形与NSImage分辨率不同的问题造成的。要解决这个问题,把NSImage的size设置为点阵的尺寸即可。

以下这段代码可以解决这个问题:

NSImageRep* rep = [image bestRepresentationForDevice:nil];

NSSize imgSize = NSMakeSize([rep pixelsWide],[rep pixelsHigh]);

[image setSize:imgSize];

实现方法:

NSView子类中加入:
[self lockFocus];
 
NSBitmapImageRep *bits;
bits = [[NSBitmapImageRep alloc]
                   initWithFocusedViewRect: [self bounds]];
[self unlockFocus];
 
这样就可以将其保存在NSImage中,或者保存为文件等。
 
如果你希望将图形保存为矢量信息,你可以使用 [self dataWithPDFInsideRect: [self bounds]] 然后建立一个NSPDFImageRep。不要使用NSEPSImageRep因为PS格式转换速度比较缓慢。

如何将一幅图片保存为文件存储

以下是将图片保存为PNG的代码。也可以保存为TIFF, BMP, GIF, JPEG格式。

 
 

NSBitmapImageRep *bits = …; // get a rep from your image, or grab from a view

 

 

 
NSData *data;
 

data = [bits representationUsingType: NSPNGFileType

 

 

                                           properties: nil];
 

[data writeToFile: @"/path/to/wherever/test.png"

 

 

            atomically: NO];

平滑图片放大的方法

有时候如果你从文件中读取一幅图像放入NSImage中,在放大时可能得不到相应的平滑效果。以下代码可以帮你解决:

 
NSImage *image;
image = [[NSImage alloc] initWithContentsOfFile: path];
 
NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];
 
NSSize size = NSMakeSize ([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];
 

把字符串的文字内容转换为矢量路径图形

如果你希望将某一段文本转化为NSBezierPath路径,然后进行放大或者用特殊方式进行描绘,如何实现呢?下面是方法。

点击这里阅读全文 »

用Cocoa截取屏幕内容并保存为图片

让我们来写一个抓屏程序吧。当然,你知道只要按command+shift+3就可以抓取当前屏幕对吧?本文介绍如何用cocoa程序来实现这一功能。

点击这里阅读全文 »

如何在Cocoa中使用CGContext

 

你可以在Cocoa View中使用Core Graphics函数,只需要传递当前图形端口:
 
#define cgrect(nsrect) (*(CGRect *)&(nsrect))
- (void) drawRect: (NSRect) rect
{
    NSRect bounds = [self bounds];
        
    NSGraphicsContext *cocoaContext = [NSGraphicsContext currentContext];
    CGContextRef context = (CGContextRef)[cocoaContext graphicsPort];
        
    CGContextSetLineWidth (context, 5.0);
        
    CGContextBeginPath(context); {
        CGContextAddRect (context, cgrect(bounds));
        CGContextSetRGBFillColor (context, 1.0, 0.9, 0.8, 1.0);
    } CGContextFillPath(context);
        
} // drawRect

在矩形正中画出需要显示的字符串

下面是实现代码:

NSString *blah = @"OOXXOOX";
NSSize size = [blah sizeWithAttributes: nil];
 
NSPoint startPoint;
startPoint.x = bounds.origin.x + bounds.size.width / 2 - size.width / 2;
startPoint.y = bounds.origin.y + bounds.size.height / 2 - size.height / 2;
 
[blah drawAtPoint: startPoint
   withAttributes: nil];

从NSRect中创建一个NSValue

实现代码如下:

   

    NSRect selectionRect = …;

    NSValue *value;

    value = [NSValue valueWithRect: selectionRect];



最新评论

最新讨论