image_helper.py
Go to the documentation of this file.
00001 # Software License Agreement (BSD License)
00002 #
00003 # Copyright (c) 2012, Willow Garage, Inc.
00004 # All rights reserved.
00005 #
00006 # Redistribution and use in source and binary forms, with or without
00007 # modification, are permitted provided that the following conditions
00008 # are met:
00009 #
00010 #  * Redistributions of source code must retain the above copyright
00011 #    notice, this list of conditions and the following disclaimer.
00012 #  * Redistributions in binary form must reproduce the above
00013 #    copyright notice, this list of conditions and the following
00014 #    disclaimer in the documentation and/or other materials provided
00015 #    with the distribution.
00016 #  * Neither the name of Willow Garage, Inc. nor the names of its
00017 #    contributors may be used to endorse or promote products derived
00018 #    from this software without specific prior written permission.
00019 #
00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00031 # POSSIBILITY OF SUCH DAMAGE.
00032 
00033 import array
00034 from cStringIO import StringIO
00035 import sys
00036 
00037 from PIL import Image
00038 from PIL import ImageOps
00039 import cairo
00040 
00041 
00042 def imgmsg_to_pil(img_msg, rgba=True):
00043     try:
00044         if img_msg._type == 'sensor_msgs/CompressedImage':
00045             pil_img = Image.open(StringIO(img_msg.data))
00046             if pil_img.mode != 'L':
00047                 pil_img = pil_bgr2rgb(pil_img)
00048         else:
00049             alpha = False
00050             pil_mode = 'RGB'
00051             if img_msg.encoding == 'mono8':
00052                 mode = 'L'
00053             elif img_msg.encoding == 'rgb8':
00054                 mode = 'RGB'
00055             elif img_msg.encoding == 'bgr8':
00056                 mode = 'BGR'
00057             elif img_msg.encoding in ['bayer_rggb8', 'bayer_bggr8', 'bayer_gbrg8', 'bayer_grbg8']:
00058                 mode = 'L'
00059             elif img_msg.encoding == 'mono16' or img_msg.encoding == '16UC1':
00060                 pil_mode = 'F'
00061                 if img_msg.is_bigendian:
00062                     mode = 'F;16B'
00063                 else:
00064                     mode = 'F;16'
00065             elif img_msg.encoding == 'rgba8':
00066                 mode = 'BGR'
00067                 alpha = True
00068             elif img_msg.encoding == 'bgra8':
00069                 mode = 'RGB'
00070                 alpha = True
00071             else:
00072                 raise Exception("Unsupported image format: %s" % img_msg.encoding)
00073             pil_img = Image.frombuffer(pil_mode, (img_msg.width, img_msg.height), img_msg.data, 'raw', mode, 0, 1)
00074 
00075         # 16 bits conversion to 8 bits
00076         if pil_img.mode == 'F':
00077             pil_img = pil_img.point(lambda i: i*(1./256.)).convert('L')
00078             pil_img = ImageOps.autocontrast(pil_img)
00079 
00080         if rgba and pil_img.mode != 'RGBA':
00081             pil_img = pil_img.convert('RGBA')
00082 
00083         return pil_img
00084 
00085     except Exception, ex:
00086         print >> sys.stderr, 'Can\'t convert image: %s' % ex
00087         return None
00088 
00089 
00090 def pil_bgr2rgb(pil_img):
00091     rgb2bgr = (0, 0, 1, 0,
00092                0, 1, 0, 0,
00093                1, 0, 0, 0)
00094     return pil_img.convert('RGB', rgb2bgr)
00095 
00096 
00097 def pil_to_cairo(pil_img):
00098     w, h = pil_img.size
00099     data = array.array('c')
00100     data.fromstring(pil_img.tostring())
00101 
00102     return cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, w, h)


rqt_bag_plugins
Author(s): Aaron Blasdel, Tim Field
autogenerated on Mon Oct 6 2014 07:15:50