|
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- #
- # img2txt image to text converter
- # Copyright (c) 2010 Alex Foulon <alxf@lavabit.com>
- #
- # This file is a Python port of "src/img2txt.c"
- # which is:
- # Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
- # 2007 Jean-Yves Lamoureux <jylam@lnxscene.org>
- # All Rights Reserverd
- #
- # This library is free software. It comes without any warranty, to
- # the extent permitted by applicable law. You can redistribute it
- # and/or modify it under the terms of the Do What the Fuck You Want
- # to Public License, Version 2, as published by Sam Hocevar. See
- # http://www.wtfpl.net/ for more details.
- #
-
- import getopt
- import os
- import sys
-
- import caca
- from caca.canvas import Canvas, CanvasError
- from caca.dither import Dither, DitherError
-
- RMASK = 0x00ff0000
- GMASK = 0x0000ff00
- BMASK = 0x000000ff
- AMASK = 0xff000000
- BPP = 32
- DEPTH = 4
-
- HELP_MSG = """\
- Usage: %s [OPTIONS]... <IMAGE>
- Convert IMAGE to any text based available format.
- Example: %s -w 80 -f ansi ./caca.png
-
- Options:
- -h, --help This help
- -v, --version Version of the program
- -W, --width=WIDTH Width of resulting image
- -H, --height=HEIGHT Height of resulting image
- -x, --font-width=WIDTH Width of output font
- -y, --font-height=HEIGHT Height of output font
- -b, --brightness=BRIGHTNESS Brightness of resulting image
- -c, --contrast=CONTRAST Contrast of resulting image
- -g, --gamma=GAMMA Gamma of resulting image
- -d, --dither=DITHER Dithering algorithm to use
- -f, --format=FORMAT Format of the resulting image
- -C, --charset=CHARSET Charset of the resulting image
-
- DITHER list:
- - none: no dithering
- - ordered2: 2x2 ordered dithering
- - ordered4: 4x4 ordered dithering
- - ordered8: 8x8 orederd dithering
- - random: random dithering
- - fstein: Floyd-Steinberg dithering
-
- FORMAT list:
- - caca: native libcaca format
- - ansi: ANSI
- - utf8: UTF-8 with ANSI escape codes
- - utf8cr: UTF-8 with ANSI escape codes and MS-DOS \\r
- - html: HTML
- - html3: backwards-compatible HTML
- - bbfr: BBCode (French)
- - irc: IRC with mIRC colours
- - ps: PostScript document
- - svg: SVG vector image
- - tga: TGA image
- - troff: troff source
-
- CHARSET list:
- - ascii: use only ascii character
- - shades: use unicode character
- - blocks: use unicode quarter-cell combinations
- """ % (os.path.basename(sys.argv[0]), os.path.basename(sys.argv[0]))
-
- VERSION_MSG="""\
- img2txt Copyright 2006-2007 Sam Hocevar and Jean-Yves Lamoureux
- Copyright 2010 Alex Foulon
- Internet: <sam@hocevar.net> <jylam@lnxscene.org>
- <alxf@lavabit.com> version: %s
-
- img2txt, along with its documentation, may be freely copied and distributed.
-
- The latest version of img2txt is available from the web site,
- http://caca.zoy.org/wiki/libcaca in the libcaca package.
- """ % caca.get_version()
-
- def main():
- """ Main script function.
- """
-
- #init options vars
- width = None
- height = None
- font_width = 6
- font_height = 10
- brightness = None
- contrast = None
- gamma = None
- ditalgo = None
- exformat = "ansi"
- charset = None
-
- #define long and short options
- shortopts = "hvW:H:x:y:b:c:g:d:f:C:"
- longopts = [
- "help",
- "version",
- "width=",
- "height=",
- "font-width=",
- "font-height=",
- "brightness=",
- "contrast=",
- "gamma=",
- "dither=",
- "format=",
- "charset=",
- ]
-
- #parse command line
- try:
- opts, args = getopt.getopt(sys.argv[1:], shortopts, longopts)
- except getopt.GetoptError, err:
- sys.stderr.write("%s\n" % str(err))
- sys.exit(127)
-
- for o, a in opts:
- if o in ('-h', '--help'):
- sys.stdout.write(HELP_MSG)
- sys.exit(0)
- elif o in ('-v', '--version'):
- sys.stdout.write("%s\n" % VERSION_MSG)
- sys.exit(0)
- elif o in ('-W', '--width'):
- width = int(a)
- elif o in ('-H', '--height'):
- height = int(a)
- elif o in ('-x', '--font-width'):
- font_width = int(a)
- elif o in ('-y', '--font-height'):
- font_height = int(a)
- elif o in ('-b', '--brightness'):
- brightness = float(a)
- elif o in ('-c', '--contrast'):
- contrast = float(a)
- elif o in ('-g', '--gamma'):
- gamma = float(a)
- elif o in ('-d', '--dither'):
- ditalgo = a
- elif o in ('-f', '--format'):
- exformat = a
- elif o in ('-C', '--charset'):
- charset = a
-
- if not args:
- sys.stderr.write("%s: Missing argument...\n" % os.path.basename(sys.argv[0]))
- sys.exit(127)
- else:
- try:
- img = Image.open(args[0])
- img.load()
- except IOError, err:
- sys.stderr.write("%s\n" % err)
- sys.exit(127)
-
- if not width and not height:
- width = 60
- height = width * img.size[1] * font_width / img.size[0] / font_height
- elif width and not height:
- height = width * img.size[1] * font_width / img.size[0] / font_height
- elif not width and height:
- width = height * img.size[0] * font_height / img.size[1] / font_width
-
- #init canvas
- try:
- cv = Canvas(width, height)
- except CanvasError, err:
- sys.stderr.write("%s\n" % err)
- sys.exit(127)
-
- cv.set_color_ansi(caca.COLOR_DEFAULT, caca.COLOR_TRANSPARENT)
-
- #init dither
- try:
- #convert rgb to rgba
- if img.mode == 'RGB':
- img = img.convert('RGBA')
- #reorder rgba
- if img.mode == 'RGBA':
- r, g, b, a = img.split()
- img = Image.merge("RGBA", (b, g, r, a))
-
- dit = Dither(BPP, img.size[0], img.size[1], DEPTH * img.size[0],
- RMASK, GMASK, BMASK, AMASK)
- except DitherError, err:
- sys.stderr.write("%s\n" % err)
- sys.exit(127)
-
- #set dither algorithm
- if ditalgo:
- dit.set_algorithm(ditalgo)
-
- #set brightness
- if brightness:
- dit.set_brightness(brightness)
-
- #set gamma
- if gamma:
- dit.set_gamma(gamma)
-
- #set contrast
- if contrast:
- dit.set_contrast(contrast)
-
- #set charset
- if charset:
- dit.set_charset(charset)
-
- #create dither
- dit.bitmap(cv, 0, 0, width, height, img.tostring())
-
- #print export to screen
- sys.stdout.write("%s" % cv.export_to_memory(exformat))
-
- if __name__ == "__main__":
- #Import PIL package
- try:
- from PIL import Image
- except ImportError, err:
- sys.stderr.write("You need to install PIL module !\n")
- sys.exit(2)
-
- main()
|