[Founders At Work]Firefox创始人Blake Ross -2

Livingston:跟我说说Firefox是怎么开始的?
Ross:Firefox脱胎于Mozilla,Mozilla本身有非常漫长的历史现在我并不打算谈论。我个人是在2000年开始参与Mozilla项目的。它是开源的,任何人都可以参与。最初我是跟Netscape团队紧密合作,因为他们在Mozilla为他们的产品奠基。我则帮他们修改BUG,然后他们就邀请我在一个夏天去做个兼职。我曾对发布Netscpe有所帮助,这真是一个很酷的头份工作。

Livingston:你当时只有14岁,对吗?
Ross:是的,我在加利福尼亚工作,那真是一个美妙的夏天。然后我就开始在家工作一段时间,当第二年夏天再次回去的时候,事情已经变得很糟糕。Netscape在市场上的份额变得越来越小。当时,他们大约还有5%的市场份额。 那是后AOL时代,也是后浏览器大战时代.AOL开始注资并向浏览器要求更多盈利时,事情就得更令人失望了。他们收购Netscape花了大约四千万美元,现在要求投资回报了。
于是,浏览器开始变成一个仅仅是把用户带到Netscape.com的工具。在那里放满了搜索按钮,又贴遍广告。一团糟。那种文化并不是着眼用户的。在那里工作充满了痛苦。
Firefox更多的是对我们在Netcape经历的回应,而不是针对浏览器的老大——IE。IE在当时几乎被抛弃了,2001年,微软解释了IE团队。所以我们开始Firefox,以一种我们所知的可行的方式来做浏览器——如果我们不被市场,销售和其它在Netscape时所受的影响。它开始于我们——在Netscape里打着为用户作正确决定的斗争的人——之中的三四个人。
举个便子,在Nescape 7中我们想加入“弹出广告停止”的功能。它将成为第一个包含“弹出阻止”的主流浏览器。Mozilla分支上的代码都已经编好了,但是最终并没有包含进去,因为Netscape.com含有弹出式广告。这种决定总是痛苦的,而挂上我们的名字释出这种产品则令人沮丧。所以我们开始了一个叫作Phoenix的项目,名字取材于神话中一种在自己的骨灰中重生的鸟。这就像这个项目是在Netscape的骨灰中重生的。

Livingston:都有哪些人?
Ross: David Hyatt, Joe Hewitt——他们也是我现在新公司的合伙人,Parakey—我负责开发, Brian Ryner和Asa Dotzler提供构建和QA支持。那年的前六个月,项目非常随性,下班后我们在Denny’s餐厅做一些东西。后来我回到迈阿密,在线工作了一段时间。Phoenix基本上是我们控制的Mozilla源码库的一个分支。我们关闭了代码,因为觉得当你面对无数追寻利润的Netscape人和无数避开主题又想达到一致的开源Geek时,完全面向用户开发是不可能的。我们只是想要关起门来做一些我们认为对的事情。我们经历了很多名字变更,Mozilla给矛了很多支持。这差不多就是它怎么开始的。

Livingston:还有些什么名字:
Ross:创建的时候它叫Phoenix,很快我们就遇到了商标问题。那时只有三个人,同时我们都不是律师,所以只能做一些某些人要求我们做的事情。在这件事情上,Phoenix技术公司起诉我们因为他们也有同名的浏览器产品。我们就把它更名为Firebird,因为看起来它们是一样的,可是有一个开源数据库已经叫了这个名字。所以我们只好再次重命名。那时它已经开始流行——虽然没像现在这么流行——所以我们要保持名字中“Fire”的部分。仅仅是找一个叫Fire-任何东西的名字几个月,有人想到了Firefox,它实际上是一种红色熊猫的中国名字。

Livingston:Firefox的开发者都在不同的地方吗?
Ross:刚开始的时候我们都在Netscape。然后Dave去Apple开发Safari,我们也得到了一些新的海外伙伴,比如新西兰的Ben Goodger,法国的Pierre Chanial,还有斯洛伐克的Jan Varga.我回到了迈阿密,继续在网上与他们合作。
在Parakey,我和Joe依然通过IM来协作,虽然我们只相隔20分钟路程,因为从Firefox开始就习惯了这种方式。相比与我开车去找他或他开车来找我,这种方式快太多了。

Livingston:Dave在Apple工作会造成困扰吗?
Ross:是的。他们也在开发面向初级用户的浏览器,他也无法在一个竞争对手那里开发同样的东西。那并不是终局,只是一个问题。

Livingston:他离开Apple了?
Ross:没有。他现在还在开发Safari。他开发了Firefox,然后离开,去了Apple。

Livingston:所以你们人数很少。
Ross:Firefox的团队一直在变化。说我们人数很少实际上是不公平的,因为我们的工作基于Mozilla,很明显的,Mozilla拥有大量开发者,同时还有很多开发者在做核心布局引擎。Firefox团队自身——就是关心核心引擘的方方面面以及工作在代码库分支的那些人——头年总是保持在四五人的规模。现在更多些,显而易见,因为这是主代码树。所有的这些人曾从事Mozilla,现在开发Firefox。

[pil-handbook翻译]使用指南-5

更多图像载入方法 为了叙述的方便,Image模块里的open函数经常被用来打开像文件。在多数情况下,你只需要传给它一个文件名作为参数即可:
im = Image.open(”lena.ppm”)
如果一切顺利,返回的是一个Image实例,否则,将会引起一枚IOError异常。
你也可以用一个类文件的实列来代替文件名。这个实例必须实现read, seek 和tell方法,并以binary模式打开.
从一个打开的文件流读取:
fp = open(”lena.ppm”, “rb”)
im = Image.open(fp)
从一个字节流数据读取图像,使用StringIO类 :
从一个字节流读取:
import StringIO
im = Image.open(StringIO.StringIO(buffer))
注意,图像库可以在读取图像文件头之前就回朔图像(使用seek(0)),另外,seek也可以用于那些已经被读取的(使用load的方法)图像。如果图像被包含在一个大文件中,比如tar包,你可以使用ContainerIO或TarIO来读取它。
从一个TAR包读取
import TarIO

fp = TarIO.TarIO(”Imaging.tar”, “Imaging/test/lena.ppm”)
im = Image.open(fp)
控制编码
    一些编码器允读你在读入图像之后对它进行操作。这个特性通常用于创建缩略图(效率高于图像质量)和使用单色激光打印机(仅需要一个灰度图)时.
    draft方法操作的是一个打开而未载入的图像,因此它只能提供尽可能接近给定的模式和大小的结果。它是通过重新配置图像编码来完成这一功能的。
    用drft模式读取:
im = Image.open(file)
print “original =”, im.mode, im.size

im.draft(”L”, (100, 100))
print “draft =”, im.mode, im.size
    打印出的信息大概是这样:
original = RGB (512, 512)
draft = L (128, 128)
请注意,这里的结果图像并没有跟给定的模式与大小完全吻合。如果要确定结果不大于给定的大小,需使用thumbnail方法.
上一页 PIL目录
注:后面是一些概念和库说明什么的,没啥好翻  翻译到此为此
原文链接

[pil-handbook翻译]使用指南-4

图像序列(动画)
    PIL包含对图像序列(也叫动画格式)的基本支持。所支持的序列图格式包括FLI/FLC, GIF和一部分还在试验中的格式。TIFF同样可以包含超过一帧的图像。
    当你打开一个图像序列文件,PIL自动载入这个序列的第一帧。
    你可以使用seek和tell方法在不同的帧之间移动:
Example: Reading sequences
import Image
im = Image.open(”animation.gif”)
im.seek(1) # skip to the second frame
try:
 
while 1:
im.seek(im.tell()+1)
# do something to im
except EOFError:
pass # end of sequence
    如这个例子所示,当序列结束时你将得到一个EOFError异常。
    注意,在当前库版本中的大部分方法都只允许你称动到下一帧(如上面的例子所示)。如果要回溯图像,你可以重新打开.
    下面这个iterator类使你可以用for语名来循环图像序列:
Example: A sequence iterator class
class ImageSequence:
def __init__(self, im):
 
self.im = im
def __getitem__(self, ix):
 
try:
 
 
if ix:
 
self.im.seek(ix)
return self.im
except EOFError:
 
raise IndexError # end of sequence
for frame in ImageSequence(im):
# …do something to frame…
Postscript [...]

[pil-handbook翻译]指用指南-3

颜色转换
    使用convert函数,PIL让你可以在不同的图像模式之间转换。
Example: 转换模式
im = Image.open(”lena.ppm”).convert(”L”)
    图像库支持所有图像模式到 “L”和”RGB”模式之间的转换。如果需要在其它两种模式之间转化,你可以使用一个中间图像(一般是一枚”RGB”图像)
图像增强
    PIL提供了许多方法和模块来支持图像增强。
    滤镜
    ImageFilter模块预置了一系列图像增强滤镜与filter方法一起使用。
    Example: 应用滤镜
import ImageFilter
out = im.filter(ImageFilter.DETAIL)
    象素操作
    point方法可以用来改变一个图像象素点的值。(例,图像对比操作)。在大多数情况下,一个函数需要一个参数来运行。
每个象素都可以依照以下函数进行处理:
Example: Applying point transforms

# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)

    使用上述技术,你可以快速地在一枚图像上应用任何表达式。你也可以综合使用point和paste方法来选择性地修改一枚图像:
    Example: 处理单个颜色通道

# split the image into individual bands
source = im.split()
R, G, B = 0, 1, 2
# select regions where red is less than [...]

[pil-handbook翻译]使用指南-2

剪切,粘贴与合并图像
    Image类所包含的方法可以让你对图像的某个区域进行操作。取到图像的一个子区,可以使用crop方法。
    Example: 从图像中复制一小框
box = (100, 100, 400, 400)
region = im.crop(box)
    这个区域以一个四元组定义,其坐标表示为(左,上,右,下).PIL使用一个以(0,0)代表左上角的坐标系统。同时也要注意坐标指向的位置是以像素标识,所以在上面这个例子中的区域刚好是300×300像素。
    现在,这个图区可以做一些处理然后粘贴回去。
    Example: 处理一个子区,再贴回去
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
    当粘贴一个区域时,该区域的大小必须与给定的大小吻合,另外,粘贴区也不能延展到图像外面。但是,原始图像和粘贴区域的格式并不需要一致。如果它们不一致,粘贴域会自动进行转化。(在下方的颜色转换部分会有详细讨论)
    这里是另一个例子
    Example: Rolling an image
def roll(image, delta):
“Roll an image sideways”
xsize, ysize = image.size
delta = delta % xsize
if delta == 0: return image
part1 = image.crop((0, 0, delta, ysize))
part2 = image.crop((delta, 0, xsize, ysize))
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, [...]

[pil-handbook翻译]Python Imaging Library 概览

简介
    Python Imaging Library为您的python程序添加有图像处理能力的接口。
    这个库提供扩展文件格式支持——一种高效的扩展方式——和相当强大的图像处理能力。
    核心图像库是为快速访问一些基本像素格式图像设计的。它能为普通图像处理工具提供一个可靠的基础。
    让我们来看一个这个库的可能应用:
图像归档
    针对于图像归档和批处理,Python Imaging Library是理想的程序。你可以用这个库来创建缩略呼,转化图像格工,打印图片等等。
   
    Python Imaging Library的最新版本可以识别并读取多数图像格式。保存时则有意地限制为最常用的交流和发布格式。
图像显示
    最新发布版本包含Tk PhotoImage and BitmapImage 接口,Windows DIB 接口也可以随着PythonWin一起使用。而对了X 和Mac系统的显示,您可以使用Jack Jansen的图像库。
    调试版本(可能指非release版本)中,于Unix版本也提供show方法调用xv来显示图像。

图像处理
    图像库包含一些基本的图像处理函数,包括像素操作,一系列内置convolution kernel的滤镜和颜色空间变换。
    同时也提供图像缩放,旋转和任意几何变换的支持。
    提供histogram方法使您可以输出对某个图像的一些统计信息。这可以用于自动对比增强和全局统计分析。
PIL目录  下一页