How to resize a Gdk.Pixbuf to the size of a Gtk.Image visible area

I wrote a simple image viewer that will load a photo image into a Gtk.Image widget using a Gdk.Pixbuf.  I then added a tool bar with four clickable icons.  Zoom out, zoom in, fit to window and original size.

All but the fit to window worked well.  When I pulled the width and height from image1.GetSizeRequest(out width, out height), width & height were returned as -1.  Not helpful.  Google didn’t give me many clues either 🙁

What I needed was something that would provide the visible area of the Gdk.Image widget:

In order to get the visible area, we need to:

  • upcast Gtk.Image to a Gtk.GdkWindow
  • retrieve a Gdk.Region from the VisibleRegion method
  • retrieve the first Gdk.Rectangle from the array returned from the visibleRegion.GetRectangles method
  • extract the Height and Width from the Gdk.Rectangle

Now that we have the height and the width of the visible area of the Gtk.Image widget, we need to scale the image (Gdk.Pixbuf) while keeping the aspect. Assigning the image to the Gtk.Image widget will automatically redraw itself.

protected virtual void zoomToWindow (object sender, System.EventArgs e)
   if (image1.Pixbuf != null) {
     int new_width, new_height;
     int height = image1.Pixbuf.Height;
     int width = image1.Pixbuf.Width;

     Gdk.Region visibleRegion = image1.GdkWindow.VisibleRegion;
     Gdk.Rectangle rectangle = visibleRegion.GetRectangles()[0];
     new_height = rectangle.Height;
     new_width = rectangle.Width;
     scaleImage(height, width, ref new_height, ref new_width, 0);
     image1.Pixbuf = pictureBuf.ScaleSimple(new_width, new_height, Gdk.InterpType.Bilinear);

There we go 🙂
While the code above is C#, the same principle goes for any language that uses Gtk.

Share Button

Rip a dvd with HandbrakeCLI on Ubuntu Linux 8.04 (Hardy Heron) for the Sony PS3 (mpeg4 / h.264)

After much trial and error, I chose HandbrakeCLI for ripping a dvd to a h.264 mpeg4 file that I can play on my Sony Playstation 3 console. Please note that HandBrake does quite well on live action video but not so good on animation.

% sudo aptitude install build-essential
% sudo aptitude install zlib1g-dev jam yasm
% wget
% tar zxvf HandBrake-0.9.2.tar.gz
% cd HandBrake
% ./configure
% jam
% cp HandBrakeCLI ../bin  # to copy the binary into the user's bin dir

We need yasm installed to pick up any cpu extensions that our cpu supports. For example: MMX MMXEXT SSE SSE2 3DNow!

Now that we have a working HandBrakeCLI binary built for our system (works for 32bit or 64bit depending on which system we built it on).

I wrote a very simple script that will rip the dvd (legal dvd rip btw) into a mp4 file, copy it to the media-server which will be picked up automatically by mediatomb.


#  [genre]

nice -n 15 ~/bin/HandBrakeCLI -i /dev/dvd -e x264 -b 1200 -B 160 -R 48 -E faac -f mp4 -P=16 -x level=41:subme=5:me=umh -T -2 -d -7 -8 -O --crop -m -N eng -o "$1"

if [ -f "$1" ]
  if [ $2 ]
    echo copying $1 to media-server /home/jason/Videos/$2
    scp "$1" "jason@media-server:/home/jason/Videos/$2/$1" && rm -f "$1"
    echo copying $1 to media-server /home/jason/Videos
    scp "$1" "jason@media-server:/home/jason/Videos/$1" && rm -f "$1"

Handbrake documentation is available on the Handbrake wiki website.

UPDATE: If you’re looking for a GUI front end for HandBrakeCLI on Linux, check out RippedWire by th3rmite.

Screenshot: HandBrakeGTK 1.0.1 - Queue Tab

Share Button

Reinstalling Beagle on Ubuntu 8.04 causes System.DllNotFoundException libgalago error

A while back I removed the Beagle and Tracker desktop search engines from my Ubuntu 8.04.  As I’ve been consolidating more and more information into my home directory, I thought I would be able to simply install Beagle.

Installing Beagle

Boy was I wrong!  When I started up beagle search, I was rewarded with it dying on me:

$ beagle-search
Debug: Done reading conf from /etc/beagle/config-files/BeagleSearch.xml
Debug: Done reading conf from /home/jason/.beagle/config/Daemon.xml
Debug: Done reading conf from /etc/beagle/config-files/Daemon.xml
Exception in Gtk# callback delegate
  Note: Applications can use GLib.ExceptionManager.UnhandledException to handle the exception.
System.DllNotFoundException: libgalago
  at (wrapper managed-to-native) Galago.Global:galago_init (intptr,int)
  at Galago.Global.Init (System.String name, InitFlags flags) [0x00000] 
  at Galago.Global.Init (System.String name) [0x00000] 
  at Beagle.Util.GalagoTools.GetPresence (System.String service_id, System.String username) [0x00000] 
  at Search.Tiles.IMLog.GetBuddyStatus () [0x00000] 
  at Search.Tiles.IMLog.GetDetails () [0x00000] 
  at Search.Tiles.Tile.get_Details () [0x00000] 
  at Search.MainWindow.ShowInformation (Search.Tiles.Tile tile) [0x00000] 
  at Search.GroupView.OnTileSelected (System.Object tile, System.EventArgs args) [0x00000] 
  at Search.Tiles.Tile.OnFocusInEvent (Gdk.EventFocus f) [0x00000] 
  at Gtk.Widget.focusinevent_cb (IntPtr widget, IntPtr evnt) [0x00000] 
   at GLib.ExceptionManager.RaiseUnhandledException(System.Exception e, Boolean is_terminal)
   at Gtk.Widget.focusinevent_cb(IntPtr widget, IntPtr evnt)
   at Gtk.Widget.focusinevent_cb(IntPtr , IntPtr )
   at Gtk.Widget.gtk_widget_grab_focus(IntPtr )
   at Gtk.Widget.gtk_widget_grab_focus(IntPtr )
   at Gtk.Widget.GrabFocus()
   at Search.Category.Select(Boolean focus, Boolean extended)
   at Search.GroupView.Finished(Boolean grabFocus)
   at Search.MainWindow.OnFinished(Beagle.FinishedResponse response)
   at Beagle.Query.OnFinished(Beagle.ResponseMessage r)
   at Beagle.RequestMessage.OnAsyncResponse(Beagle.ResponseMessage response)
   at Beagle.Transport+EventThrowingClosure.ThrowEvent()
   at GLib.Idle+IdleProxy.Handler()
   at GLib.Idle+IdleProxy.Handler()
   at Gtk.Application.gtk_main()
   at Gtk.Application.gtk_main()
   at Gtk.Application.Run()
   at Gnome.Program.Run()
   at Search.MainWindow.Main(System.String[] args)

I not so quickly determined I was missing libgalago-gtk1 and libgalago-gtk1.0-cil.  Once I installed them, everything was working properly!

Installing libgalago

Share Button