"""Utility functions."""
matplotlib.use("Agg")
def save_image(inp_array, image_file):
	"""Function that dumps the image to disk."""
	inp_array = np.clip(inp_array, 0, 255).astype(np.uint8)
	image = Image.fromarray(inp_array)
	buf = StringIO.StringIO()
	image.save(buf, format="JPEG")
	with open(image_file, "w") as f:
		f.write(buf.getvalue())
	return None
def image_flipud(images):
	"""Function that flip (up-down) the np image."""
	quantity = images.get_shape().as_list()[0]
	image_list = []
	for k in xrange(quantity):
		image_list.append(tf.image.flip_up_down(images[k, :, :, :]))
	outputs = tf.stack(image_list)
	return outputs
def resize_image(inp_array, new_height, new_width):
	"""Function that resize the np image."""
	inp_array = np.clip(inp_array, 0, 255).astype(np.uint8)
	image = Image.fromarray(inp_array)
	image = image.resize((new_width, new_height))
	return np.array(image)
def display_voxel(points, vis_size=128):
	"""Function to display 3D voxel."""
	try:
		data = visualize_voxel_spectral(points, vis_size)
	except ValueError:
		data = visualize_voxel_scatter(points, vis_size)
	return data
def visualize_voxel_spectral(points, vis_size=128):
	"""Function to visualize voxel (spectral)."""
	points = np.rint(points)
	points = np.swapaxes(points, 0, 2)
	fig = p.figure(figsize=(1, 1), dpi=vis_size)
	verts, faces = measure.marching_cubes_classic(points, 0, spacing=(0.1, 0.1, 0.1))
	ax = fig.add_subplot(111, projection="3d")
	ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap="Spectral_r", lw=0.1)
	ax.set_axis_off()
	fig.tight_layout(pad=0)
	fig.canvas.draw()
	data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="").reshape(vis_size, vis_size, 3)
	p.close("all")
	return data
def visualize_voxel_scatter(points, vis_size=128):
	"""Function to visualize voxel (scatter)."""
	points = np.rint(points)
	points = np.swapaxes(points, 0, 2)
	fig = p.figure(figsize=(1, 1), dpi=vis_size)
	ax = fig.add_subplot(111, projection="3d")
	x = []
	y = []
	z = []
	(x_dimension, y_dimension, z_dimension) = points.shape
	for i in range(x_dimension):
		for j in range(y_dimension):
			for k in range(z_dimension):
				if points[i, j, k]:
					x.append(i)
					y.append(j)
					z.append(k)
	ax.scatter3D(x, y, z)
	ax.set_axis_off()
	fig.tight_layout(pad=0)
	fig.canvas.draw()
	data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="").reshape(vis_size, vis_size, 3)
	p.close("all")
	return data