next up previous contents
Next: Image Flip: example_pictureflip.c Up: Image Processing using GTK. Previous: Border: example_colorborder.c   Contents

Colour Invert: example_colorinvert.c

#include<gtk/gtk.h>
#include<glib/gprintf.h>
#include<string.h>

void colorinvert_picture(GdkPixbuf *pb)
{ 
  int ht,wt;
  int i=0,j=0;
  int rowstride=0;  
  int bpp=0;
  gchar *pixel;


  if(gdk_pixbuf_get_bits_per_sample(pb)!=8)   //we handle only 24 bit images.
  	return;                               //look at 3 bytes per pixel.

  bpp=3;	         	  //getting attributes of height,
  ht=gdk_pixbuf_get_height(pb);   //width, and bpp.Also get pointer
  wt=gdk_pixbuf_get_width(pb);	  //to pixels.
  pixel=gdk_pixbuf_get_pixels(pb);
  rowstride=wt*bpp;

  for(i=0;i<ht;i++)		//iterate over the height of image.
    for(j=0;j<rowstride;j+=bpp)   //read every pixel in the row.skip
				//bpp bytes 
      {	
      
      //access pixel[i][j] as
      // pixel[i*rowstride + j]

      //access red,green and blue as
	pixel[i*rowstride + j+0]=255-pixel[i*rowstride + j+0];
	pixel[i*rowstride + j+1]=255-pixel[i*rowstride + j+1];
	pixel[i*rowstride + j+2]=255-pixel[i*rowstride + j+2];	      
      }  
  return;
}

GtkWidget* get_image(const gchar *filename)
{

  GtkWidget *im;
  GdkPixbuf *pb;
  gchar *savefile,*file;
  pb=gdk_pixbuf_new_from_file(filename,NULL);

  colorinvert_picture(pb);

  //ignore the extension and save as jpeg.
  file=g_strdup(filename);
  savefile=strchr(file,'.');
  if(savefile!=NULL)
    *savefile='\0';   
  savefile=g_strdup_printf("%s%s",file,"_colorinvert.jpeg");

  gdk_pixbuf_save(pb,savefile,"jpeg",NULL,NULL);//save the file
  im=gtk_image_new_from_pixbuf(pb);
  gdk_pixbuf_unref(pb);

  g_free(savefile);
  g_free(file);
  return im;
}


int main(int argc,char *argv[])
{
  GtkWidget *w,*vb,*b;
  gchar *file="kathakali.jpeg";
  gtk_init(&argc,&argv);
  w=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW(w),200,200);
  
  b=gtk_button_new_with_mnemonic("_Exit");   

  vb=gtk_vbox_new(FALSE,FALSE);
  gtk_container_add(GTK_CONTAINER(w),vb);
  gtk_box_pack_start_defaults(GTK_BOX(vb),get_image(file));
  gtk_box_pack_start_defaults(GTK_BOX(vb),gtk_hseparator_new());

  gtk_box_pack_start_defaults(GTK_BOX(vb),gtk_image_new_from_file(file));
  gtk_box_pack_start_defaults(GTK_BOX(vb),b);//exit button.
  

  gtk_signal_connect(GTK_OBJECT(w),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
  gtk_signal_connect(GTK_OBJECT(b),"clicked",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

  gtk_widget_show_all(w);
  
  gtk_main();
  return 0;
}

//compilation lines
//gcc -Wall example_colorinvert.c `pkg-config libgnomeui-2.0 --cflags --libs`



Muthiah 2004-06-04