Re: Displaying a Pixmap



On Mon, 26 Feb 2007 12:13:10 -0500
zentara <zentara1 sbcglobal net> wrote:

On Sun, 25 Feb 2007 14:52:25 -0500
"Scott White" <whitews gmail com> wrote:

I ran into the same problem when I tried to display a sample DICOM,
it says 

" Attempt to draw a drawable with depth 16 to a drawable with depth 24"

As I played around, it seems the default depth for the Viewport I tried to
write to is 24, and I can't find a place to change it. So I'm guessing you need to
unpack the 16 bit file and repack it as 24?  And there is the problem of
lopping of the header, to get to the actual data. If anyone is interested in
playing with this, here is a free sample DICOM image and it's info file.
http://barre.nom.fr/medical/samples/files/CT-MONO2-16-brain.gz
http://barre.nom.fr/medical/samples/files/CT-MONO2-16-brain.txt

Well, I'm probably sticking my neck out here, but I love getting
slapped down as long as you edify me. :-)

I took a feeble shot at it, and have some results that may help someone.
I used the dctoraw utility from the dicomtools to strip the header, to get
the raw pixel block. See:
 http://www.dclunie.com/dicom3tools/workinprogress/dicom3tools_1.00.snapshot.20070202b.tar.bz2 
 
For the impatient, I've posted the  CT-MONO2-16-brain.raw  file
at   http://zentara.net/perlplay/DICOM 
so you can try the script below.

This script displays the file properly, except the colors are way off.
The pack unpack may need tweaking or I was just lucky. :-)

Anyways, I think you might be able to use pixbuf, if you can figure out
how to do the unpack-pack better than me. :-)  And there still is the tricky
problem of using Perl to strip the unweildy DICOM header.

#!/usr/bin/perl
use strict;
use warnings;
use Gtk2 '-init';
use Glib qw/TRUE FALSE/;

#my $file = shift || die "Need an dicon file as argument $!\n";
my $file = 'CT-MONO2-16-brain.raw';

my $data;
open (FH,"< $file");
read( FH, $data, -s FH );
close FH;
print length $data,"\n";

my $mw = Gtk2::Window->new;
$mw->signal_connect('destroy', sub { Gtk2->main_quit });

$mw->resize(500,500);

my $vbox = Gtk2::VBox->new( FALSE, 6 );
$mw->add($vbox);
$vbox->set_border_width(2);

my $sw = Gtk2::ScrolledWindow->new(undef, undef);
$sw->set_policy('automatic','automatic');
$vbox->pack_start($sw,TRUE,TRUE,0);

my $vp = Gtk2::Viewport->new(undef, undef);
$sw->add($vp);


my $ha = Gtk2::Adjustment->new(50, 0, 1, 0.1, 0.9, 1);
my $va = Gtk2::Adjustment->new(50, 0, 1, 0.1, 0.9, 1);

$sw->set_hadjustment($ha);
$sw->set_vadjustment($va);


my $button = Gtk2::Button->new ('Load');
$button->signal_connect (clicked => \&load_image );
$vbox->pack_end($button,FALSE,FALSE,0);

$mw->show_all();
Gtk2->main;

##########################################################
sub load_image {

my $width = 512;
my $height = 512;

# crappy attempt to convert
my @nums = unpack("(B16)*",$data);
#print "@nums\n";
my @nums1 = map{ pack("(B24)*",$_) } @nums;
$data = join '', @nums1;

my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_data
                ($data,      # the data.  this will be copied.
                'rgb',       # only currently supported colorspace
                0,           # true, because we do have alpha channel data
                8,           # gdk-pixbuf currently allows only 8-bit samples
                $width,      # width in pixels
                $height,     # height in pixels
                $width * 3); # rowstride -- we have RGB data, so it's 3
                             # bytes per pixel.

my $img = Gtk2::Image->new();
$img->set_from_pixbuf($pixbuf);

$vp->add($img);

$mw->show_all();

return 1;
}

__END__


zentara

-- 
I'm not really a human, but I play one on earth.
http://zentara.net/japh.html



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]