def quantize(self, number_colors, colorspace='RGBColorspace', treedepth=0, dither=True, measure_error=False): self.img = quantize_image(self.img, max_colors=number_colors, dither=dither)
def process_pages(self): from calibre.utils.img import ( image_to_data, rotate_image, remove_borders_from_image, normalize_image, add_borders_to_image, resize_image, gaussian_sharpen_image, grayscale_image, despeckle_image, quantize_image ) for i, img in enumerate(self.pages): if self.rotate: img = rotate_image(img, -90) if not self.opts.disable_trim: img = remove_borders_from_image(img) # Do the Photoshop "Auto Levels" equivalent if not self.opts.dont_normalize: img = normalize_image(img) sizex, sizey = img.width(), img.height() SCRWIDTH, SCRHEIGHT = self.opts.output_profile.comic_screen_size try: if self.opts.comic_image_size: SCRWIDTH, SCRHEIGHT = map(int, [x.strip() for x in self.opts.comic_image_size.split('x')]) except: pass # Ignore if self.opts.keep_aspect_ratio: # Preserve the aspect ratio by adding border aspect = float(sizex) / float(sizey) if aspect <= (float(SCRWIDTH) / float(SCRHEIGHT)): newsizey = SCRHEIGHT newsizex = int(newsizey * aspect) deltax = (SCRWIDTH - newsizex) / 2 deltay = 0 else: newsizex = SCRWIDTH newsizey = int(newsizex / aspect) deltax = 0 deltay = (SCRHEIGHT - newsizey) / 2 if newsizex < MAX_SCREEN_SIZE and newsizey < MAX_SCREEN_SIZE: # Too large and resizing fails, so better # to leave it as original size img = resize_image(img, newsizex, newsizey) img = add_borders_to_image(img, left=deltax, right=deltax, top=deltay, bottom=deltay) elif self.opts.wide: # Keep aspect and Use device height as scaled image width so landscape mode is clean aspect = float(sizex) / float(sizey) screen_aspect = float(SCRWIDTH) / float(SCRHEIGHT) # Get dimensions of the landscape mode screen # Add 25px back to height for the battery bar. wscreenx = SCRHEIGHT + 25 wscreeny = int(wscreenx / screen_aspect) if aspect <= screen_aspect: newsizey = wscreeny newsizex = int(newsizey * aspect) deltax = (wscreenx - newsizex) / 2 deltay = 0 else: newsizex = wscreenx newsizey = int(newsizex / aspect) deltax = 0 deltay = (wscreeny - newsizey) / 2 if newsizex < MAX_SCREEN_SIZE and newsizey < MAX_SCREEN_SIZE: # Too large and resizing fails, so better # to leave it as original size img = resize_image(img, newsizex, newsizey) img = add_borders_to_image(img, left=deltax, right=deltax, top=deltay, bottom=deltay) else: if SCRWIDTH < MAX_SCREEN_SIZE and SCRHEIGHT < MAX_SCREEN_SIZE: img = resize_image(img, SCRWIDTH, SCRHEIGHT) if not self.opts.dont_sharpen: img = gaussian_sharpen_image(img, 0.0, 1.0) if not self.opts.dont_grayscale: img = grayscale_image(img) if self.opts.despeckle: img = despeckle_image(img) if self.opts.output_format.lower() == 'png' and self.opts.colors: img = quantize_image(img, max_colors=min(256, self.opts.colors)) dest = '%d_%d.%s'%(self.num, i, self.opts.output_format) dest = os.path.join(self.dest, dest) with lopen(dest, 'wb') as f: f.write(image_to_data(img, fmt=self.opts.output_format)) self.append(dest)
def type(self, t): if t == 'GrayscaleType': self.img = grayscale_image(self.img) elif t == 'PaletteType': self.img = quantize_image(self.img)
def process_pages(self): from calibre.utils.img import (image_to_data, rotate_image, remove_borders_from_image, normalize_image, add_borders_to_image, resize_image, gaussian_sharpen_image, grayscale_image, despeckle_image, quantize_image) for i, img in enumerate(self.pages): if self.rotate: img = rotate_image(img, -90) if not self.opts.disable_trim: img = remove_borders_from_image(img) # Do the Photoshop "Auto Levels" equivalent if not self.opts.dont_normalize: img = normalize_image(img) sizex, sizey = img.width(), img.height() SCRWIDTH, SCRHEIGHT = self.opts.output_profile.comic_screen_size try: if self.opts.comic_image_size: SCRWIDTH, SCRHEIGHT = map(int, [ x.strip() for x in self.opts.comic_image_size.split('x') ]) except: pass # Ignore if self.opts.keep_aspect_ratio: # Preserve the aspect ratio by adding border aspect = float(sizex) / float(sizey) if aspect <= (float(SCRWIDTH) / float(SCRHEIGHT)): newsizey = SCRHEIGHT newsizex = int(newsizey * aspect) deltax = (SCRWIDTH - newsizex) // 2 deltay = 0 else: newsizex = SCRWIDTH newsizey = int(newsizex // aspect) deltax = 0 deltay = (SCRHEIGHT - newsizey) // 2 if newsizex < MAX_SCREEN_SIZE and newsizey < MAX_SCREEN_SIZE: # Too large and resizing fails, so better # to leave it as original size img = resize_image(img, newsizex, newsizey) img = add_borders_to_image(img, left=deltax, right=deltax, top=deltay, bottom=deltay) elif self.opts.wide: # Keep aspect and Use device height as scaled image width so landscape mode is clean aspect = float(sizex) / float(sizey) screen_aspect = float(SCRWIDTH) / float(SCRHEIGHT) # Get dimensions of the landscape mode screen # Add 25px back to height for the battery bar. wscreenx = SCRHEIGHT + 25 wscreeny = int(wscreenx // screen_aspect) if aspect <= screen_aspect: newsizey = wscreeny newsizex = int(newsizey * aspect) deltax = (wscreenx - newsizex) // 2 deltay = 0 else: newsizex = wscreenx newsizey = int(newsizex // aspect) deltax = 0 deltay = (wscreeny - newsizey) // 2 if newsizex < MAX_SCREEN_SIZE and newsizey < MAX_SCREEN_SIZE: # Too large and resizing fails, so better # to leave it as original size img = resize_image(img, newsizex, newsizey) img = add_borders_to_image(img, left=deltax, right=deltax, top=deltay, bottom=deltay) else: if SCRWIDTH < MAX_SCREEN_SIZE and SCRHEIGHT < MAX_SCREEN_SIZE: img = resize_image(img, SCRWIDTH, SCRHEIGHT) if not self.opts.dont_sharpen: img = gaussian_sharpen_image(img, 0.0, 1.0) if not self.opts.dont_grayscale: img = grayscale_image(img) if self.opts.despeckle: img = despeckle_image(img) if self.opts.output_format.lower() == 'png' and self.opts.colors: img = quantize_image(img, max_colors=min(256, self.opts.colors)) dest = '%d_%d.%s' % (self.num, i, self.opts.output_format) dest = os.path.join(self.dest, dest) with lopen(dest, 'wb') as f: f.write(image_to_data(img, fmt=self.opts.output_format)) self.append(dest)