发布PhotoInfo v0.6.
126 views最近喜欢上了摄影,交流的时候发现大家都会把拍摄信息加到照片上,Windows下面用光影魔术手就可以方便的做到,但是Mac下面我没找到可用的(中间尝试了iWatermark,但是不好用)。 索性自己写个算了,实现添加相框和拍摄参数。
用法:
- 拖放照片(必须是jpg格式)或者包含照片的文件夹到程序窗口。
- 设置好输出路径后点击“开始处理”就好了。
界面截图:
最近喜欢上了摄影,交流的时候发现大家都会把拍摄信息加到照片上,Windows下面用光影魔术手就可以方便的做到,但是Mac下面我没找到可用的(中间尝试了iWatermark,但是不好用)。 索性自己写个算了,实现添加相框和拍摄参数。
用法:
界面截图:
今天看到有同学问如何读写二进制文件,那就顺道讲一下吧。 在Cocoa的世界里,所有与某个物件相关的东西都被该物件实现。好吧,我承认,这句话比较扯…. 还是上例子说明吧。
在通常的编程语言里面(这里指的是C/C++/Java/C#/Ruby/…),以下几个东西是如此关联起来的:
字符串类用来处理字符串存储,查找,替换…等等常规功能。 路径类用来处理所有与文件系统路径相关的事情,比如什么把路径分段,拿到文件扩展名,文件是否存在等等。 目录类则用来看某个路径的目录是否存在,是不是为空,等等。
这里一般会有三个类来处理各自逻辑相关的事情,但是,注意但是,Cocoa里面的构建法则不是这样的,它把所有与字符串相关的功能全部封装到了字符串类里面。 所以,NSString可以做的事情超多,从打开文件读取/写入字符串内容,到判断路径是否存在,等等,所有的事情,它都一手包了。 这样倒是方便程序员了,反正一旦有什么事情和字符串有点关系,找它准没错。
好了,讲了这么一堆,回过头来看这个问题,如何读写二进制文件?我写了各种类型的数据(整形,浮点,字符串)进去,怎么读出来? 这里提到了二进制对吧,也就是数据对吧,那么好了,找NSData就行了。
来看这段小代码,我准备了一个文件路径做演示,还有几个要写进去的数据。 Read the rest of this entry »
最近迷上了摄影,拍了很多照片之后就想上传跟大家分享。到色影无忌和几个摄影论坛上一看,发现很多人的照片都有不错的边框、水印和拍摄信息(相机类型、光圈、快门、拍摄日期等等….)。 因为用的是Mac,找了很久,没有发现…(为什么每次写东西都是这个理由?) 好吧,废话少说,先把要做的事情分类。
以下是学习了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];
这是《C和指针》第六章的习题,用筛选法算质数。因为用到了动态数组,所以需要gcc 3.4 以上版本编译。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | void primes(int range) { int width = range / 2; //只计算奇数,空间效率提高一倍。 char nums[width]; char *pnums; size_t i, j, temp; for(pnums = nums; pnums < nums + width; pnums++) { *pnums = TRUE; } for(i = 1; i < width; i++) { pnums = nums + i; if (*pnums) { temp = i * 2 + 1; for(j = i + 1; j < width; j++) { if (*++pnums) { if (!((j * 2 + 1) % temp)) *pnums = FALSE; } } } } printf ("1 2 "); for(i = 1; i < width; i++) { if (nums[i]) printf("%d ", i * 2 + 1); } printf("\n"); } |
看的书是《C和指针》,现在回头再看C,有了很多新的体悟,也让我开始觉得脑子抽筋。告别太多年的指针让我死去活来,非常不习惯,好在多年养成的习惯还在,也不需要赶时间,慢慢来吧。相信啃下了指针之后就会顺滑很多了。
下面这段代码是《C和指针》第六章的一个习题,写出来很是花了我一番力气。又一次体会到了那种为写一行代码抓掉n根头发的感觉。。。。。 中间为了调试,又花时间学习了gdb,让我这个被IDE惯坏的人惊艳了很久。好东西啊!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | int del_substr(char *str, char const *substr) { char *ptr_substr = (char *)substr; char *strP = str; char *temp; bool fullMatch = TRUE; for(;*strP != '\0'; strP++) { if (*strP == *ptr_substr) break; } temp = strP; if (*temp != '\0') //Match first char. { while(*ptr_substr) { if (*temp++ != *ptr_substr++) { fullMatch = FALSE; break; } } if (fullMatch) { while(*temp) *strP++ = *temp++; *strP = '\0'; return 1; } } return 0; } |
看到Shoegazer写了篇关于他使用的Firefox3.0的扩展。参考了他的选择,我也作出了自己的选择。
应用程序: Firefox 3.0 (2008061004) 操作系统: MacOS Leopard 10.5.3
今天解决了Project Euler的第18个问题,记录一下解题思路。
从三角型的顶端逐行往下移动,然后路径上数字的和最大是23.
1 2 3 4 | 3 7 5 2 4 6 8 5 9 3 |
以上这个例子就是,3+7+4+9=23. 找到以下三角形从顶到底路径的最大和:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 75 95 64 17 47 82 18 35 87 10 20 04 82 47 65 19 01 23 75 03 34 88 02 77 73 07 63 67 99 65 04 28 06 16 70 92 41 41 26 56 83 40 80 70 33 41 48 72 33 47 32 37 16 94 29 53 71 44 65 25 43 91 52 97 51 14 70 11 33 28 77 73 17 78 39 68 17 57 91 71 52 38 17 14 91 43 58 50 27 29 48 63 66 04 68 89 53 67 30 73 16 69 87 40 31 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 |
注意:这里只有16384种路径组合,所以可以使用暴力方式得到答案。但是Problem 67,同样的题目,三角形有一百行,不能用暴力方式求解。所以,找到一个聪明的方法才是正道。
今天的算法挑战题目如下: 输入字符串,比如: “fb,bc,ac,eb,da,ga” 每组2个字母,用逗号分割。 第一个字母是节点,第2个字母是它的父结点。 写个函数处理输入字符串,并输出整个树的结构。
输出结果:
1 2 3 4 5 6 7 | c
|-a
| |-g
| |- d
|-b
|- e
|- f |
本教程的目的是帮助你开始使用Mechanize。读完这篇教程之后,你将可以抓取页面,点击链接,填写和提交form,抽取数据和其他一些可能有用的事情。此教程仅仅只是涉及到了非常粗浅的功能,但因该已经足够帮助你起步了。
你要做得第一件事情就是在代码里引用mechanize,然后初始化一个新的mechanize实例:
1 2 3 4 | require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new |
现在我们将使用刚刚创建的agent来抓取一个页面。就拿Google开刀吧:
1 | page = agent.get('http://google.com/') |
发生了什么事情?我们让mechanize去抓取Google的主页。Mechanize会自动存贮相关的cookie,甚至会跟踪Google发过来的自动跳转。Agent会帮我们抓回来一个页面,我们可以用来抽取数据,找到并且点击链接或者填写一个form.
测试了一段时间之后用mechanize+hpricot要比用正则方便很多,所以完善了一下上次写得脚本。 功能算是比较完善了,能够自动去拿目标用户的所有消息,不用手工输入留言页数了。 大家感兴趣的话可以点击这里下载。 用法: 1. 解压得到脚本“BackupFanfou.rb”. 2. 用任意文本编辑器打开上述脚本,在末尾加上下面两行:
1 2 | b = BackupFanfou.new("你的饭否登录帐号", "密码") b.backup("需要备份的用户名", "备份保存路径") |
例如:
1 2 | b = BackupFanfou.new("allengnr@gmail.com", "XXXXX") b.backup("allendang", "~/Documents/Test.txt") |