示例#1
0
static gboolean
gdk_pixbuf__gdip_image_save_PNG_to_callback (GdkPixbufSaveFunc   save_func,
                                             gpointer            user_data,
                                             GdkPixbuf          *pixbuf,
                                             gchar             **keys,
                                             gchar             **values,
                                             GError            **error)
{
  EncoderParameters encoder_params;
  LONG compression = 5;

  if (keys && *keys) {
    gchar **kiter = keys;
    gchar **viter = values;
    
    while (*kiter) {
      if (strncmp (*kiter, "tEXt::", 6) == 0) {
        /* TODO: support exif data and the like */
      }
      else if (strcmp (*kiter, "compression") == 0) {
        char *endptr = NULL;
        compression = strtol (*viter, &endptr, 10);
        
        if (endptr == *viter) {
          g_set_error (error,
                       GDK_PIXBUF_ERROR,
                       GDK_PIXBUF_ERROR_BAD_OPTION,
                       _("PNG compression level must be a value between 0 and 9; value '%s' could not be parsed."),
                       *viter);
          return FALSE;
        }
        if (compression < 0 || compression > 9) {
          /* This is a user-visible error;
           * lets people skip the range-checking
           * in their app.
           */
          g_set_error (error,
                       GDK_PIXBUF_ERROR,
                       GDK_PIXBUF_ERROR_BAD_OPTION,
                       _("PNG compression level must be a value between 0 and 9; value '%d' is not allowed."),
                       (int)compression);
          return FALSE;
        }       
      } else {
        g_warning ("Unrecognized parameter (%s) passed to PNG saver.", *kiter);
      }
      
      ++kiter;
      ++viter;
    }
  }

  encoder_params.Count = 1;
  encoder_params.Parameter[0].Guid = EncoderCompression;
  encoder_params.Parameter[0].Type = EncoderParameterValueTypeLong;
  encoder_params.Parameter[0].NumberOfValues = 1;
  encoder_params.Parameter[0].Value = &compression;

  return gdip_save_pixbuf (pixbuf, L"image/png", &encoder_params, save_func, user_data, error);
}
示例#2
0
static gboolean
gdk_pixbuf__gdip_image_save_TIFF_to_callback (GdkPixbufSaveFunc   save_func,
                                              gpointer            user_data,
                                              GdkPixbuf          *pixbuf,
                                              gchar             **keys,
                                              gchar             **values,
                                              GError            **error)
{
  return gdip_save_pixbuf (pixbuf, L"image/tiff", NULL, save_func, user_data, error);
}
示例#3
0
static gboolean
gdk_pixbuf__gdip_image_save_JPEG_to_callback (GdkPixbufSaveFunc   save_func,
                                              gpointer            user_data,
                                              GdkPixbuf          *pixbuf,
                                              gchar             **keys,
                                              gchar             **values,
                                              GError            **error)
{
  EncoderParameters encoder_params;
  LONG quality = 75; /* default; must be between 0 and 100 */

  if (keys && *keys) {
    gchar **kiter = keys;
    gchar **viter = values;
    
    while (*kiter) {
      if (strcmp (*kiter, "quality") == 0) {
        char *endptr = NULL;
        quality = strtol (*viter, &endptr, 10);
        
        if (endptr == *viter) {
          g_set_error (error,
                       GDK_PIXBUF_ERROR,
                       GDK_PIXBUF_ERROR_BAD_OPTION,
                       _("JPEG quality must be a value between 0 and 100; value '%s' could not be parsed."),
                       *viter);
          
          return FALSE;
        }
        
        if (quality < 0 ||
            quality > 100) {
          /* This is a user-visible error;
           * lets people skip the range-checking
           * in their app.
           */
          g_set_error (error,
                       GDK_PIXBUF_ERROR,
                       GDK_PIXBUF_ERROR_BAD_OPTION,
                       _("JPEG quality must be a value between 0 and 100; value '%d' is not allowed."),
                       (int)quality);
          
          return FALSE;
        }
      } else {
        g_warning ("Unrecognized parameter (%s) passed to JPEG saver.", *kiter);
      }
      
      ++kiter;
      ++viter;
    }
  }

  encoder_params.Count = 1;
  encoder_params.Parameter[0].Guid = EncoderQuality;
  encoder_params.Parameter[0].Type = EncoderParameterValueTypeLong;
  encoder_params.Parameter[0].NumberOfValues = 1;
  encoder_params.Parameter[0].Value = &quality;
     
  return gdip_save_pixbuf (pixbuf, L"image/jpeg", &encoder_params, save_func, user_data, error);
}