Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 PKG = 'rqt_bag_plugins'
00034 import roslib; roslib.load_manifest(PKG)
00035 import rospy
00036
00037 import array
00038 from cStringIO import StringIO
00039 import sys
00040
00041 import Image
00042 import cairo
00043
00044
00045 def imgmsg_to_pil(img_msg, rgba=True):
00046 try:
00047 if img_msg._type == 'sensor_msgs/CompressedImage':
00048 pil_img = Image.open(StringIO(img_msg.data))
00049 if pil_img.mode != 'L':
00050 pil_img = pil_bgr2rgb(pil_img)
00051 else:
00052 alpha = False
00053 if img_msg.encoding == 'mono8':
00054 mode = 'L'
00055 elif img_msg.encoding == 'rgb8':
00056 mode = 'RGB'
00057 elif img_msg.encoding == 'bgr8':
00058 mode = 'BGR'
00059 elif img_msg.encoding in ['bayer_rggb8', 'bayer_bggr8', 'bayer_gbrg8', 'bayer_grbg8']:
00060 mode = 'L'
00061 elif img_msg.encoding == 'mono16':
00062 if img_msg.is_bigendian:
00063 mode = 'F;16B'
00064 else:
00065 mode = 'F:16'
00066 elif img_msg.encoding == 'rgba8':
00067 mode = 'BGR'
00068 alpha = True
00069 elif img_msg.encoding == 'bgra8':
00070 mode = 'RGB'
00071 alpha = True
00072 else:
00073 raise Exception("Unsupported image format: %s" % img_msg.encoding)
00074 pil_img = Image.frombuffer('RGB', (img_msg.width, img_msg.height), img_msg.data, 'raw', mode, 0, 1)
00075
00076 if rgba and pil_img.mode != 'RGBA':
00077 pil_img = pil_img.convert('RGBA')
00078
00079 return pil_img
00080
00081 except Exception, ex:
00082 print >> sys.stderr, 'Can\'t convert image: %s' % ex
00083 return None
00084
00085
00086 def pil_bgr2rgb(pil_img):
00087 rgb2bgr = (0, 0, 1, 0,
00088 0, 1, 0, 0,
00089 1, 0, 0, 0)
00090 return pil_img.convert('RGB', rgb2bgr)
00091
00092
00093 def pil_to_cairo(pil_img):
00094 w, h = pil_img.size
00095 data = array.array('c')
00096 data.fromstring(pil_img.tostring())
00097
00098 return cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, w, h)