Core Image 学习笔记 - 为照片加边框和EXIF信息

本文介绍如何使用CoreImage调整照片尺寸、添加边框及提取并显示EXIF信息。通过设置NSGraphicsContext提高图片质量,并利用NSImage完成边框绘制。同时,文章详细说明了通过Quartz2D读取EXIF元数据的过程。

Core Image 学习笔记 - 为照片加边框和EXIF信息。

http://blog.codingmylife.com/?p=57
2,433 views, Cocoa, by Allen Dang.

最近迷上了摄影,拍了很多照片之后就想上传跟大家分享。到色影无忌和几个摄影论坛上一看,发现很多人的照片都有不错的边框、水印和拍摄信息(相机类型、光圈、快门、拍摄日期等等….)。
因为用的是Mac,找了很久,没有发现…(为什么每次写东西都是这个理由?)
好吧,废话少说,先把要做的事情分类。

1.调整图片大小,毕竟放到网上的图片不需要原图那么大。
————————————————–
以下是学习了Core Image之后的一点点实践。

NSImage *image = [[NSImage alloc] initWithContentsOfFile:path];
[image setScalesWhenResized:YES];
[image setSize:NSMakeSize(1000.0, [image size].height * (1000.0/[image size].width))];

这个方法确实可以调整大小了,但是缩小的图片质量非常差。花了很多时间仔细看文档,最后发现,Core Image其实就是对于Quartz 2D的包装,所有的绘图操作其实都值对于当前的NSGraphicsContext起作用,NSGraphicsContext本身有很多属性用来控制当前绘图的各方面。
而如果只是使用默认设置的话,绘图质量默认是最低。这里我们需要手动设置成高质量。
添加以下两行到代码开头:

//质量设置成高
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
//打开反锯齿
[[NSGraphicsContext currentContext] setShouldAntialias:YES];


2.画边框。
——–
一开始遇到的问题是,默认的NSGraphicsContext是当前窗体、View等等,我需要把它设置成我需要绘制的目标图片。出乎意料的简单。

NSImage *canvas = [[NSImage alloc] initWithSize:canvasSize];
[canvas lockFocus];
 
//Draw things here.
 
[canvas unlockFocus];

使用NSImage的lockFocus方法可以把NSGraphicsContext设置到它身上,相应的unlockFocus会还原NSGraphicsContext。

好了,现在就简单了,画边框了。

int border = 56;
 
NSRect rect = NSMakeRect(border/2, border/2, canvasSize.width - border, canvasSize.height - border);
[originImage drawInRect:rect
	fromRect:NSZeroRect
	operation:NSCompositeSourceOver
	fraction:1.0];
 
border -= 6;
[[NSColor whiteColor] set];
NSRect whiteBorderRect = NSMakeRect(border/2, border/2,
	canvasSize.width - border, canvasSize.height - border);
NSBezierPath *whiteBorder = [NSBezierPath bezierPathWithRect:whiteBorderRect];
[whiteBorder setLineJoinStyle:NSRoundLineJoinStyle];
[whiteBorder setLineWidth:2];
[whiteBorder stroke];

这样就出现了一个白边框。

3.读取照片里面的EXIF信息,然后写到图片上。
—————————————
我原先只是知道一些C的库,但是这种功能Cocoa肯定是提供了的,但是我翻边了NS开头的绘图类,就是找不到,好吧,最后发现原来这部分需要直接调用Quartz 2D的函数了。

NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
 
NSDictionary *metaData = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
NSDictionary *exifData = [metaData objectForKey:@"{Exif}"];
NSDictionary *tiffData = [metaData objectForKey:@"{TIFF}"];

Exif字典里面有所有的拍摄参数,TIFF字典里面有相机型号。

***这里有个要注意的地方,CGImageSourceRef是需要手动释放的!***
我在后期调试程序的时候发现有内存泄露,找了很久才发现这里。

需要在使用完毕之后使用 CFRelease() 释放。代码修改之后是这样的

NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
 
NSDictionary *metaData = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
NSDictionary *exifData = [metaData objectForKey:@"{Exif}"];
NSDictionary *tiffData = [metaData objectForKey:@"{TIFF}"];
 
//读取想要的信息
 
[metaData release];
CFRelease(source);

好了,现在安全了。

4. 最后一项任务就是把加上边框和拍摄信息的图片保存到文件了。
——————————————————–
一开始我直接把 NSImage 的 TIFFRepresentation 直接写入文件了,最后发现文件体积太大,完全不像是jpg压缩过的样子,后来有是一番研究,找到了以下实现:

NSData *imageData = [image TIFFRepresentation];
 
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:0.9] forKey:NSImageCompressionFactor];
imageData = [imageRep representationUsingType:NSJPEGFileType properties:imageProps];
 
[imageData writeToFile:path atomically:YES];

下面就是最后实现的效果图

temp.jpg

内容概要:本文介绍了一个关于超声谐波成像中幅度调制聚焦超声所引起全场位移和应变的分析模型,并提供了基于Matlab的代码实现。该模型旨在精确模拟和分析在超声谐波成像过程中,由于幅度调制聚焦超声作用于生物组织时产生的力学效应,包括全场的位移与应变分布,从而为医学成像和治疗提供理论支持和技术超声谐波成像中幅度调制聚焦超声引起的全场位移和应变的分析模型(Matlab代码实现)手段。文中详细阐述了模型构建的物理基础、数学推导过程以及Matlab仿真流程,具有较强的理论深度与工程应用价值。; 适合人群:具备一定声学、生物医学工程或力学背景,熟悉Matlab编程,从事医学成像、超声技术或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于超声弹性成像中的力学建模与仿真分析;②支持高强度聚焦超声(HIFU)治疗中的组织响应预测;③作为教学案例帮助理解超声与组织相互作用的物理机制;④为相关科研项目提供可复用的Matlab代码框架。; 阅读建议:建议读者结合超声物理和连续介质力学基础知识进行学习,重点关注模型假设、偏微分方程的数值求解方法及Matlab实现细节,建议动手运行并修改代码以加深理解,同时可拓展应用于其他超声成像或治疗场景的仿真研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值