mac tga转jpg

mac tga转jpg,第1张

概述本文转自http://blog.codingmylife.com/?p=57,非常感谢原作者的分享     Core Image 学习笔记 - 为照片加边框和EXIF信息。 12,073 views, Cocoa, by Allen Dang. 最近迷上了摄影,拍了很多照片之后就想上传跟大家分享。到色影无忌和几个摄影论坛上一看,发现很多人的照片都有不错的边框、水印和拍摄信息(相机类型、光圈、快门、

本文转自http://blog.codingmylife.com/?p=57,非常感谢原作者的分享

 

 

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

12,073 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 = 56NSRect 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,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 *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];

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

总结

以上是内存溢出为你收集整理的mac tga转jpg全部内容,希望文章能够帮你解决mac tga转jpg所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1067093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存