docs: def to_bytes(self):
  		"""Convert the entire image to bytes.
  		
  		:rtype: bytes
  		"""
  		
  		# grab the chunks we needs
  		out = [PNG_SIGN]
  		# FIXME: it's tricky to define "other_chunks". HoneyView stop the 
  		# animation if it sees chunks other than fctl or idat, so we put other
  		# chunks to the end of the file
  		other_chunks = []
  		seq = 0
  		
  		# for first frame
  		png, control = self.frames[0]
  		
  		# header
  		out.append(png.hdr)
  		
  		# acTL
  		out.append(make_chunk("acTL", struct.pack("!II", len(self.frames), self.num_plays)))
  		
  		# fcTL
  		if control:
  			out.append(make_chunk("fcTL", struct.pack("!I", seq) + control.to_bytes()))
  			seq += 1
  		
  		# and others...
  		idat_chunks = []
  		for type_, data in png.chunks:
  			if type_ in ("IHDR", "IEND"):
  				continue
  			if type_ == "IDAT":
  				# put at last
  				idat_chunks.append(data)
  				continue
  			out.append(data)
  		out.extend(idat_chunks)
  		
  		# FIXME: we should do some optimization to frames...
  		# for other frames
  		for png, control in self.frames[1:]:
  			# fcTL
  			out.append(
  				make_chunk("fcTL", struct.pack("!I", seq) + control.to_bytes())
  			)
  			seq += 1
  			
  			# and others...
  			for type_, data in png.chunks:
  				if type_ in ("IHDR", "IEND") or type_ in CHUNK_BEFORE_IDAT:
  					continue
  				elif type_ == "IDAT":
  					# convert IDAT to fdAT
  					out.append(
  						make_chunk("fdAT", struct.pack("!I", seq) + data[8:-4])
  					)
  					seq += 1
  				else:
  					other_chunks.append(data)
  		
  		# end
  		out.extend(other_chunks)
  		out.append(png.end)
  		
  		return b"".join(out)