/* save image to file */ static gboolean _save(struct data *data, MagickWand *wand, const gchar *uri) { gchar *desc; guchar *img_data; gsize img_len; ExceptionType severity; g_debug("in _save"); g_assert(data != NULL); g_assert(wand != NULL); g_assert(uri != NULL); if (data->gal->remove_exif && !MagickStripImage(wand)) { desc = MagickGetException(wand, &severity); g_warning("_save: error stripping image: %s\n", desc); desc = (char *) MagickRelinquishMemory(desc); } img_data = MagickGetImagesBlob(wand, &img_len); vfs_write_file(data, uri, img_data, img_len); MagickRelinquishMemory(img_data); return TRUE; }
caddr_t im_write (im_env_t *env) { if (env->ime_output_filename) { env->ime_status = MagickWriteImages (env->ime_magick_wand, env->ime_output_filename, MagickTrue); if (env->ime_status == MagickFalse) im_leave_with_error (env, "22023", "IM001", "Cannot write to file \"%.1000s\"", env->ime_output_filename); return NULL; } else { size_t length = 0; caddr_t image_blob = MagickGetImagesBlob (env->ime_magick_wand, &length); caddr_t res; if (length != 0) { res = dk_alloc_box (length, DV_BIN); memcpy (res, image_blob, length); MagickRelinquishMemory (image_blob); } else res = NEW_DB_NULL; return res; } }
static PyObject * im_GetImageBlob(PyObject *self, PyObject *args) { void *magick_pointer; MagickWand *magick_wand; unsigned char *blob; size_t length; PyObject *ret; if (!PyArg_ParseTuple(args, "O", &magick_pointer)){ return Py_BuildValue("i", 0); } magick_wand = (MagickWand *) PyCObject_AsVoidPtr(magick_pointer); blob = MagickGetImagesBlob(magick_wand, &length); ret = Py_BuildValue("s#", blob, length); MagickRelinquishMemory(blob); return ret; }
char *get_thumbnail(char *full_filename, char *thumbnail_str, size_t *thumbnail_size) { char image_data = NULL; if(full_filename == NULL || thumbnail_str == NULL) return NULL; MagickBooleanType status; MagickWand *magick_wand, *tmp_magick_wand; magick_wand=NewMagickWand(); status=MagickReadImage(magick_wand, full_filename); if (status == MagickFalse) ThrowWandException(magick_wand); size_t height = MagickGetImageHeight(magick_wand); size_t width = MagickGetImageWidth(magick_wand); ssize_t i, j; ParseMetaGeometry(thumbnail_str, &i, &j, &width, &height); if(width <= 0 || height <= 0) { logError("%s%s:Geometry %s error\n", __FILE__, __func__, thumbnail_str); } else { /* if(is_gif(full_filename)) { tmp_magick_wand = magick_wand; magick_wand = MagickCoalesceImages(tmp_magick_wand); tmp_magick_wand = DestroyMagickWand(tmp_magick_wand); } */ MagickResetIterator(magick_wand); while (MagickNextImage(magick_wand) != MagickFalse) { MagickThumbnailImage(magick_wand,height,width); } image_data = MagickGetImagesBlob(magick_wand, thumbnail_size); } magick_wand=DestroyMagickWand(magick_wand); return image_data; }
unsigned char *covert_image(MagickWand *magick_wand, img_transition_info *image_transition_info, size_t *thumbnail_size) { unsigned char *image_data = NULL; MagickBooleanType status; // MagickWand *tmp_magick_wand = NULL; PixelWand *background = NULL; size_t height = MagickGetImageHeight(magick_wand); size_t old_height = height; size_t width = MagickGetImageWidth(magick_wand); size_t old_width = width; int is_crop = 0; int is_Crop = 0; int is_thumbnail = 0; ssize_t i = 0, j = 0; char is_gif_flag = 0; char is_jpeg_flag = 0; int do_quality = 0; char *fileformat = NULL; size_t cw = 0; //crop weight size_t ch = 0; //crop height size_t x_offset = 0; size_t y_offset = 0; fileformat = MagickGetImageFormat(magick_wand); if (fileformat == NULL) { return NULL; } if (0 == strcasecmp(fileformat, image_format[GIFEXT])) { is_gif_flag = 1; } else if (0 == strcasecmp(fileformat, image_format[JPEGEXT])) { is_jpeg_flag = 1; } else if (0 == strcasecmp(fileformat, image_format[JPGEXT])) { is_jpeg_flag = 1; } fileformat = (char *) MagickRelinquishMemory(fileformat); //free(); if ('c' == image_transition_info->transition_str[0]) { is_crop = 1; } else if ('C' == image_transition_info->transition_str[0]) { is_Crop = 1; } else { is_thumbnail = 1; } if (is_crop) { ParseMetaGeometry(image_transition_info->transition_str + 1, &i, &j, &width, &height); } else if (is_thumbnail) { ParseMetaGeometry(image_transition_info->transition_str, &i, &j, &width, &height); if (old_width == width && height == old_height) //���ߴ���ͬ���������� is_thumbnail = 0; } else if (is_Crop) { if (0 >= get_Crop_width_height( image_transition_info->transition_str + 1, &cw, &ch, &x_offset, &y_offset)) { logError("%s%s:Crop %s error\n", __FILE__, __func__, image_transition_info->transition_str + 1); return NULL; } #if 0 if(cw > width || ch > height) { image_data = MagickGetImagesBlob(magick_wand, thumbnail_size); magick_wand = DestroyMagickWand(magick_wand); return image_data; } #endif //�õ�height��width,�����Ӧ��x_offset,yoffset; get_Crop_offset_and_wh(cw, ch, &width, &height, &x_offset, &y_offset); } if (old_width == width && height == old_height && (is_Crop == 0) && (image_transition_info->is_rotate == 0) && (image_transition_info->is_quality == 0)) { image_data = MagickGetImagesBlob(magick_wand, thumbnail_size); } else if (width <= 0 || height <= 0) { logError("%s%s:Geometry %s error\n", __FILE__, __func__, image_transition_info->transition_str); } else { /* * if type of the image is GIF, maybe have more than one frame, so do this different * from others */ // if (is_gif_flag) { // tmp_magick_wand = magick_wand; // magick_wand = MagickCoalesceImages(tmp_magick_wand); // tmp_magick_wand = magick_wand; // magick_wand = MagickOptimizeImageLayers(tmp_magick_wand); // tmp_magick_wand = DestroyMagickWand(tmp_magick_wand); // } /* * if size of the image less than 800 * 600 and that's type is JPEG, then do * quality 100 OP */ if ((old_width < 800) && (old_height < 600) && is_jpeg_flag && is_crop != 1 && (image_transition_info->is_quality == 0)) { do_quality = 1; } background = NewPixelWand(); status = PixelSetColor(background, "#000000"); /* for gif MagickResetIterator(magick_wand); */ MagickWand *tmp_magick_wand = MagickGetImage(magick_wand); // while (MagickNextImage(tmp_magick_wand) != MagickFalse) { if (do_quality) { MagickSetImageCompressionQuality(tmp_magick_wand, 100); MagickStripImage(tmp_magick_wand); } if (is_thumbnail == 1) { MagickThumbnailImage(tmp_magick_wand, width, height); } else if (is_crop == 1) { MagickCropImage(tmp_magick_wand, width, height, i, j); } else if (is_Crop == 1) { MagickThumbnailImage(tmp_magick_wand, width, height); MagickCropImage(tmp_magick_wand, cw, ch, x_offset, y_offset); if (is_gif_flag) { // gif should thumbnail again MagickThumbnailImage(tmp_magick_wand, cw, ch); } } if (image_transition_info->is_rotate == 1) { MagickRotateImage(tmp_magick_wand, background, (double) (image_transition_info->degree)); } if (image_transition_info->is_quality) { MagickSetImageCompressionQuality(tmp_magick_wand, image_transition_info->quality); } MagickStripImage(tmp_magick_wand); // } background = DestroyPixelWand(background); image_data = MagickGetImagesBlob(tmp_magick_wand, thumbnail_size); tmp_magick_wand = DestroyMagickWand(tmp_magick_wand); // // if (is_gif_flag) { // magick_wand = DestroyMagickWand(magick_wand); // } } return image_data; }
unsigned char *get_thumbnail(char *full_filename, char *thumbnail_str, size_t *thumbnail_size, int is_rotate, int rotate_degree) { unsigned char *image_data = NULL; if (full_filename == NULL || thumbnail_str == NULL) return NULL; MagickBooleanType status; MagickWand *tmp_magick_wand = NULL; MagickWand *magick_wand = NULL; magick_wand = NewMagickWand(); status = MagickReadImage(magick_wand, full_filename); if (status == MagickFalse) { ThrowWandException(magick_wand); return NULL; } PixelWand *background = NULL; size_t height = MagickGetImageHeight(magick_wand); size_t old_height = height; size_t width = MagickGetImageWidth(magick_wand); size_t old_width = width; ssize_t i = 0, j = 0; int is_crop = 0; char is_gif_flag = 0; char is_jpeg_flag = 0; int do_quality = 0; char *fileformat = NULL; fileformat = MagickGetImageFormat(magick_wand); if (fileformat == NULL) { return NULL; } if (0 == strcasecmp(fileformat, image_format[GIFEXT])) { is_gif_flag = 1; } else if (0 == strcasecmp(fileformat, image_format[JPEGEXT])) { is_jpeg_flag = 1; } else if (0 == strcasecmp(fileformat, image_format[JPGEXT])) { is_jpeg_flag = 1; } fileformat = (char *)MagickRelinquishMemory(fileformat); //free(); if( 'C' == *thumbnail_str ||'c' == *thumbnail_str ) { is_crop = 1; } if(is_crop) { ParseMetaGeometry(thumbnail_str + 1, &i, &j, &width, &height); } else { ParseMetaGeometry(thumbnail_str, &i, &j, &width, &height); } if (old_width == width && height == old_height) { image_data = MagickGetImagesBlob(magick_wand, thumbnail_size); } else if (width <= 0 || height <= 0) { logError("%s%s:Geometry %s error\n", __FILE__, __func__, thumbnail_str); } else { /* * if type of the image is GIF, maybe have more than one frame, so do this different * from others */ if (is_gif_flag) { tmp_magick_wand = magick_wand; magick_wand = MagickCoalesceImages(tmp_magick_wand); tmp_magick_wand = DestroyMagickWand(tmp_magick_wand); } /* * if size of the image less than 800 * 600 and that's type is JPEG, then do * quality 100 OP */ if ((old_width < 800) && (old_height < 600) && is_jpeg_flag && is_crop != 1) { do_quality = 1; } MagickResetIterator(magick_wand); while (MagickNextImage(magick_wand) != MagickFalse) { if(do_quality) { MagickSetImageCompressionQuality(magick_wand, 100); MagickStripImage(magick_wand); } if(is_crop == 0) MagickThumbnailImage(magick_wand, width, height); else { logInfo("crop Image %ld, %ld", i, j); MagickCropImage(magick_wand, width, height, i, j); } if(is_rotate == 1) { background=NewPixelWand(); status=PixelSetColor(background,"#000000"); MagickRotateImage(magick_wand, background,(double)rotate_degree); background=DestroyPixelWand(background); } } image_data = MagickGetImagesBlob(magick_wand, thumbnail_size); } magick_wand = DestroyMagickWand(magick_wand); return image_data; }