def get_image(self, latitute_range, longitude_range, width, height, polyline=None, polyline_color=None, \
                  polyline_width=None, attribution=None, dots=None):
        assert len(latitute_range) == 2
        assert latitute_range[0] < latitute_range[1]
        assert len(longitude_range) == 2
        assert longitude_range[0] < longitude_range[1]

        center = ((latitute_range[0] + latitute_range[1]) / 2., (longitude_range[0] + longitude_range[1]) / 2.)

        image_info = self._get_best_zoom_data(center, latitute_range, longitude_range, width, height)

        if not image_info:
            return None

        stitched = self._stitch_tiles(image_info.tile_1, image_info.tile_2, self.tile_size)

        """ DEBUG:
        draw = mod_imagedraw.Draw(stitched) 
        draw.ellipse((image_info.center_x - 2, image_info.center_y - 2, image_info.center_x + 2, image_info.center_y + 2), fill=(0, 0, 0))

        red = (255, 0, 0)
        draw.ellipse((image_info.widthheight_window_1[0] - 2, image_info.widthheight_window_1[1] - 2, image_info.widthheight_window_1[0] + 2, image_info.widthheight_window_1[1] + 2), fill=red)
        draw.ellipse((image_info.widthheight_window_2[0] - 2, image_info.widthheight_window_2[1] - 2, image_info.widthheight_window_2[0] + 2, image_info.widthheight_window_2[1] + 2), fill=red)
        draw.ellipse((image_info.widthheight_window_1[0] - 2, image_info.widthheight_window_2[1] - 2, image_info.widthheight_window_1[0] + 2, image_info.widthheight_window_2[1] + 2), fill=red)
        draw.ellipse((image_info.widthheight_window_2[0] - 2, image_info.widthheight_window_1[1] - 2, image_info.widthheight_window_2[0] + 2, image_info.widthheight_window_1[1] + 2), fill=red)

        blue = (0, 0, 255)
        draw.ellipse((image_info.latlon_window_1[0] - 2, image_info.latlon_window_1[1] - 2, image_info.latlon_window_1[0] + 2, image_info.latlon_window_1[1] + 2), fill=blue)
        draw.ellipse((image_info.latlon_window_2[0] - 2, image_info.latlon_window_2[1] - 2, image_info.latlon_window_2[0] + 2, image_info.latlon_window_2[1] + 2), fill=blue)
        draw.ellipse((image_info.latlon_window_1[0] - 2, image_info.latlon_window_2[1] - 2, image_info.latlon_window_1[0] + 2, image_info.latlon_window_2[1] + 2), fill=blue)
        draw.ellipse((image_info.latlon_window_2[0] - 2, image_info.latlon_window_1[1] - 2, image_info.latlon_window_2[0] + 2, image_info.latlon_window_1[1] + 2), fill=blue)

        stitched.show()
        """

        # Draw waypoints/lines:
        if polyline:
            self._draw_line(stitched, image_info, polyline, width=polyline_width, \
                    color=polyline_color, dots=dots)

        # Crop:
        cropped = self._crop(stitched, image_info);

        attribution = attribution if attribution != None else '(c) OSM contributors'
        self._draw_attribution(cropped, attribution, width, height)

        return cropped