diff --git a/.gitignore b/.gitignore new file mode 100755 index 000000000..f5dd4a557 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.o +*.pyc +build/ +dist/ +.DS_Store +.hg/ +.hgignore +.idea/ +.project/ +Demos/ignores/ diff --git a/Demos/README.md b/Demos/README.md new file mode 100644 index 000000000..6cb6944b5 --- /dev/null +++ b/Demos/README.md @@ -0,0 +1,10 @@ +# Resources about PIL + +PIL Handbook +http://www.pythonware.com/library/pil/handbook/index.htm + +python 简单图像处理 series, ¥lan¥ +http://www.cnblogs.com/xianglan/archive/2010/12/25/1916953.html + +PIL 学习笔记 series, Neil Chen +http://www.cnblogs.com/RChen/archive/2007/03/31/pil_1.html \ No newline at end of file diff --git a/Demos/access_pixsel/access_pixsel.py b/Demos/access_pixsel/access_pixsel.py new file mode 100644 index 000000000..9a3e6e269 --- /dev/null +++ b/Demos/access_pixsel/access_pixsel.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "captcha.jpg") + +im = Image.open(fp = file_path) +im = im.draft("L", im.size) +w, h = im.size[0], im.size[1] +pixsels = im.load() + +print "width:", w +print "high:", h +print "white(255) ~ black(0):", pixsels[0, 0] + +def print_im(im, w = None, h = None): + if isinstance(im, Image.Image): + w, h = im.size[0], im.size[1] + pixsels = im.load() + else: + pixsels = im + + for x in xrange(w): + for y in xrange(h): + + if pixsels[x, y] > 128: + print " ", + else: + print "1", + print + +print_im(im, w, h) \ No newline at end of file diff --git a/Demos/crop/crop.py b/Demos/crop/crop.py new file mode 100644 index 000000000..42fb9dcc1 --- /dev/null +++ b/Demos/crop/crop.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "l_hires.jpg") + +im = Image.open(fp = file_path) + +left_upper_x, left_upper_y = 400, 100 +right_lower_x, right_lower_y = 700, 450 +box = (left_upper_x, left_upper_y, right_lower_x, right_lower_y) + +region = im.crop(box) + +new_filename = "x".join([str(i) for i in box]) + ".jpg" +region.save(new_filename) diff --git a/Demos/cutting_pasting_and_merging/cutting_pasting_and_merging.py b/Demos/cutting_pasting_and_merging/cutting_pasting_and_merging.py new file mode 100644 index 000000000..5361da2bb --- /dev/null +++ b/Demos/cutting_pasting_and_merging/cutting_pasting_and_merging.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +""" +copy image +""" +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "l_hires.jpg") +im = Image.open(fp = file_path) + +left_upper_x, left_upper_y = 10, 10 +right_lower_x, right_lower_y = 50, 50 +box = (left_upper_x, left_upper_y, right_lower_x, right_lower_y) + +region = im.crop(box) + +region = region.transpose(Image.ROTATE_90) +im.paste(region, box) + +new_filename = "C-c-C-v-left" + ".jpg" +im.save(new_filename) \ No newline at end of file diff --git a/Demos/draw_line/draw_line.py b/Demos/draw_line/draw_line.py new file mode 100644 index 000000000..bd8b2062e --- /dev/null +++ b/Demos/draw_line/draw_line.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +import Image +import ImageDraw + +BLACK = 0 +WHITE = 255 + + +canvas_w, canvas_h = 100, 100 +im = Image.new(mode = "L", size = (canvas_w, canvas_h), color = WHITE) + +draw = ImageDraw.Draw(im = im) + +left_top_x, left_top_y = 10, 10 +right_bottom_x, right_bottom_y = 30, 100 +box = (left_top_x, left_top_y, right_bottom_x, right_bottom_y) + +draw.line(xy = box, fill = BLACK, width = 1) + +im.save("draw_line.bmp") diff --git a/Demos/draw_points/draw_points.py b/Demos/draw_points/draw_points.py new file mode 100644 index 000000000..4300ab769 --- /dev/null +++ b/Demos/draw_points/draw_points.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +import Image +import ImageDraw + + +BLACK = 0 +WHITE = 255 + + +canvas_w, canvas_h = 100, 100 +im = Image.new(mode = "L", size = (canvas_w, canvas_h), color = WHITE) + +draw = ImageDraw.Draw(im = im) + +p1_x, p1_y = 10, 10 +p2_x, p2_y = 15, 15 +p3_x, p3_y = 20, 10 + +xy = (p1_x, p1_y) +# or +# xy = (p1_x, p1_y, p2_x, p2_y, p3_x, p3_y) + + +fill = "#000" + +draw.point(xy, fill) + +im.save("draw_points.bmp") diff --git a/Demos/draw_rectangle/draw_rectangle.py b/Demos/draw_rectangle/draw_rectangle.py new file mode 100644 index 000000000..77284d24a --- /dev/null +++ b/Demos/draw_rectangle/draw_rectangle.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +import Image +import ImageDraw + +BLACK = 0 +WHITE = 255 + + +canvas_w, canvas_h = 100, 100 +im = Image.new(mode = "L", size = (canvas_w, canvas_h), color = WHITE) + +draw = ImageDraw.Draw(im = im) + +left_top_x, left_top_y = 10, 10 +right_bottom_x, right_bottom_y = 30, 100 +box = (left_top_x, left_top_y, right_bottom_x, right_bottom_y) + +draw.rectangle(xy = box, fill = BLACK, outline = None) + +im.save("draw_rectangle.bmp") diff --git a/Demos/draw_text/draw_text.py b/Demos/draw_text/draw_text.py new file mode 100644 index 000000000..f9e93a85c --- /dev/null +++ b/Demos/draw_text/draw_text.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +from PIL import Image, ImageDraw, ImageFont +import sys + +BLACK = 0 +WHITE = 255 + +canvas_w, canvas_h = 100, 100 +im = Image.new(mode = "L", size = (canvas_w, canvas_h), color = WHITE) + +draw = ImageDraw.Draw(im = im) + +left_top_x, left_top_y = 10, 10 +begin = left_top_x, left_top_y + +text = "hello world" +fill = "#000" + +if sys.platform == "darwin": + filename = "/Library/Fonts/Microsoft/Times New Roman Bold.ttf" +elif sys.platform == "win32": + #filename = "C:/Windows/Fonts/timesbd.ttf" + filename = "timesbd.ttf" +else: + raise Exception +font_size = 14 +font = ImageFont.truetype(filename = filename, size = font_size) + +draw.text(xy = begin, text = text, fill = fill, font = font) + +im.save("draw_text.bmp") diff --git a/Demos/flip/flip.py b/Demos/flip/flip.py new file mode 100644 index 000000000..8a87f7082 --- /dev/null +++ b/Demos/flip/flip.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "captcha.jpg") +im = Image.open(fp = file_path) + +#new_im = im.transpose(Image.FLIP_LEFT_RIGHT) +#new_filename = os.path.splitext(filepath)[0] + "flip_left_right" + ".jpg" + +new_im = im.transpose(Image.FLIP_TOP_BOTTOM) +new_filename = os.path.splitext(os.path.basename(file_path))[0] + '-' + "flip_top_bottom" + ".jpg" + +new_im.save(new_filename) \ No newline at end of file diff --git a/Demos/grayscale/grayscale.py b/Demos/grayscale/grayscale.py new file mode 100644 index 000000000..d92f6d6a6 --- /dev/null +++ b/Demos/grayscale/grayscale.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "l_hires.jpg") + +im = Image.open(fp = file_path) + +# "L" (8-bit pixels, black and white) +# http://www.pythonware.com/library/pil/handbook/concepts.htm +new_im = im.convert("L") +new_file_name = os.path.splitext(os.path.basename(file_path))[0] +new_file_name = new_file_name + '-' + 'grayscale' + '.bmp' +new_im.save(new_file_name) + diff --git a/Demos/histogram/histogram.py b/Demos/histogram/histogram.py new file mode 100644 index 000000000..f5c868c5a --- /dev/null +++ b/Demos/histogram/histogram.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image, ImageDraw + +file_path = os.path.join(parent_path, "image_resources", "captcha.jpg") + +BLACK = 0 +WHITE = 255 +# white(255) ~ black(0) + +im = Image.open(fp = file_path) +w, h = im.size[0], im.size[1] + +print "width:", w +print "high:", h + + +im = im.draft("L", im.size) + +pixsels = im.load() + + +for x in xrange(w): + for y in xrange(h): + if pixsels[x, y] > 128: + pixsels[x, y] = WHITE + else: + pixsels[x, y] = BLACK + + +counts = [] +for x in xrange(w): + count = len([1 for y in xrange(h) + if pixsels[x, y] is BLACK]) + + counts.append(count) + + +hist_im = Image.new(mode = "L", size = (w, h), color = WHITE) +draw = ImageDraw.Draw(hist_im) +h_step = h / max(counts) + +for x in xrange(w): + left_top_x, left_top_y = x, h - counts[x] * h_step + right_bottom_x, right_bottom_y = x + 1, h + box = (left_top_x, left_top_y, right_bottom_x, right_bottom_y) + draw.rectangle(xy = box, fill = BLACK) + +new_file_name = os.path.splitext(os.path.basename(file_path))[0] +new_file_name = new_file_name + '-' + 'histogram' + '.bmp' + +hist_im.save(new_file_name) \ No newline at end of file diff --git a/Demos/image_info/get_img_info.py b/Demos/image_info/get_img_info.py new file mode 100644 index 000000000..22ff55f69 --- /dev/null +++ b/Demos/image_info/get_img_info.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "captcha.jpg") + +im = Image.open(fp = file_path) +w, h = im.size[0], im.size[1] + +print "format:", type(im.format), im.format +print "info:", type(im.info), im.info +print "mode:", type(im.mode), im.mode +print "size:", type(im.size), im.size +print "bands:", type(im.getbands()), im.getbands() +print "histogram:", type(im.histogram()) + +data = im.getdata() +print "getdata:", type(data) +assert len(im.getdata()) == w * h \ No newline at end of file diff --git a/Demos/image_resources/captcha.jpg b/Demos/image_resources/captcha.jpg new file mode 100644 index 000000000..e5d7db2f2 Binary files /dev/null and b/Demos/image_resources/captcha.jpg differ diff --git a/Demos/image_resources/l_hires.jpg b/Demos/image_resources/l_hires.jpg new file mode 100644 index 000000000..39d05bf7b Binary files /dev/null and b/Demos/image_resources/l_hires.jpg differ diff --git a/Demos/image_resources/lena_std.tif b/Demos/image_resources/lena_std.tif new file mode 100644 index 000000000..ffe5c835d Binary files /dev/null and b/Demos/image_resources/lena_std.tif differ diff --git a/Demos/rotate/rotate.py b/Demos/rotate/rotate.py new file mode 100644 index 000000000..85d0303f2 --- /dev/null +++ b/Demos/rotate/rotate.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", "captcha.jpg") + +im = Image.open(fp = file_path) +degress = 90 +new_im = im.rotate(degress) + +new_filename = os.path.splitext(os.path.basename(file_path))[0] + "-rotate-" + str(degress) + ".jpg" +new_im.save(new_filename) \ No newline at end of file diff --git a/Demos/thumbnail/create_thumbnail.py b/Demos/thumbnail/create_thumbnail.py new file mode 100644 index 000000000..d46e43f47 --- /dev/null +++ b/Demos/thumbnail/create_thumbnail.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +import os +PWD = os.path.dirname(os.path.realpath(__file__)) +parent_path = os.path.dirname(PWD) + +import Image + +file_path = os.path.join(parent_path, "image_resources", 'l_hires.jpg') +im = Image.open(fp = file_path) + +width, height = im.size[0], im.size[1] +new_size = (width/8, height/8) + +im.thumbnail(new_size) + +new_filename= "x".join([str(i) for i in new_size]) +new_filename = os.path.splitext(os.path.basename(file_path))[0] + '-' + new_filename + ".jpg" +new_file_path = os.path.join(PWD, new_filename) + +im.save(new_filename) \ No newline at end of file