2011-01-08 2 views
1

Ich möchte eine Perl-Anwendung mit tk schreiben, um eine große 2D-Darstellung zu visualisieren (es kann als 2D-Bild betrachtet werden). Ich brauche Scrollen und Größenanpassung. Außerdem muss ich nicht das gesamte Bild im Speicher speichern.perl-tk: Interaktivität Visualisierung einer großen 2d Raster Daten (wie xvcg)

Es ist zu groß, um in einem großen Bild gespeichert zu werden, aber ich kann jeden Teil davon neu zeichnen. Also, ich möchte eine grafische Anwendung schreiben, um diese Daten im interaktiven Modus anzuzeigen. Dies ist wie das, was für Graphen tun xvcg: http://blogs.oracle.com/amitsaha/resource/blog-shots/apt-rdepends.png (es ist beispielsweise die Schnittstelle Es gibt x und y Bildlaufleisten und Zoom-Balken.)

Meine Daten sehen ein bisschen wie http://www.access-excel-vba.com/giantchart.png ohne Text mit Verdünner (1px) Linien, viele Punkte auf ihnen und haben Größen (im Moment) von 33000x23000 und wird größer sein. Ich benutze 2bit-pro-Pixel-Bilder.

Also, wie kann ich einen scrollbaren und zoombaren Bildbetrachter in Perl/tk programmieren? Die Anforderung besteht nicht darin, das gesamte Bild im Speicher zu speichern (190 MB jetzt und mehr!), Sondern eine Funktion, um es in Teilen zu zeichnen.

Über Sprache/Toolkit-Auswahl. Mein Datengenerator ist auf Perl geschrieben, OS ist Unix/POSIX, daher möchte ich die Sprache nicht wechseln. Ich kann zu einem anderen Grafik-Toolkit wechseln, aber perl/tk ist auf den Ziel-PCs vorinstalliert.

Antwort

2

Verwenden Sie ein Canvas Widget. Sie können Bilder platzieren oder direkt zeichnen. In diesem Fall würde die integrierte Methode scale die Größenänderung übernehmen. Mit den rechten Handlern für das Scrollen konnten Sie dynamisch Inhalt laden und entladen, während Sie sich bewegten, um die Speichernutzung vernünftig zu halten. z.B. Der Rückruf für die -xscrollcommand würde erkennen, wenn Sie rechts in einen entladenen Bereich scrollen und den Inhalt für diesen Bereich laden. Du könntest Gegenstände einmal ausladen und dann vom Bildschirm verschwinden.

2

Das hört sich witzig an, aber ich denke, Ihr bester Ansatz wäre es, sich ein paar Artikel über das Schreiben eines effizienten 2D-Kachel-Scroll-Spiels anzusehen. Ich habe etwas geschrieben, was Sie zuvor in Java beschrieben haben, aber die Kernkonzepte sind die gleichen. Wenn Sie herausfinden, wie Sie Ihr Bild in kleinere Kacheln zerlegen können, müssen Sie nur die sichtbaren Teile streamen und skalieren.

Alternativ können Sie das gesamte Bild auf Festplatte rendern und dann etwas wie http://www.labnol.org/internet/design/embed-large-pictures-panoramas-web-pages-google-maps-image-viewer/2606/ verwenden. Google Maps greift das gleiche Problem auf, das Sie erwähnt haben, jedoch in einem viel größeren Umfang. Diese Technik kann das von Ihnen erstellte Bild für Sie unterbrechen und Ihnen dann ermöglichen, es in eine browserbasierte Lösung zu leiten. Wohlgemerkt, dies ist ein Schritt außerhalb Ihrer Perl-Anforderung, aber es kann Ihren Anforderungen entsprechen.

+0

Es für den allgemeinen Fall gut, aber ich möchte schnell den Fall lösen. perl und tk erlaubt mir, mich schnell zu entwickeln. Außerdem denke ich vor einer Minute über Kacheln (wie Gmaps) - ich brauche sie nicht, weil ich sehr schnell (0,5 sec für 1Mpix) jedes Bildfragment regenerieren kann. Dies ist ein Programmierer-Dienstprogramm, kein Spiel, so ist es normal, einen Teil der Sekunde zu warten – osgx

+0

Wenn Fliesen haben Größe von 256x256 Pix, brauche ich für kleine Fall eine 128x90 Fliesen. Und ich möchte viele verschiedene Bilder analysieren, also muss ich 11520 Kacheln und mehr für jedes Bild speichern ??? Aber die Daten, die zum Erzeugen des Bildes verwendet werden, sind gut strukturiert und können in einer Datei gespeichert werden. – osgx

1

Wenn Sie dies nicht durch Arbeiten mit gekachelten Fotobildern in einer Zeichenfläche bearbeiten möchten (was im Wesentlichen Michael Carman und NBJack vorschlagen), könnten Sie Ihren eigenen benutzerdefinierten Bildtyp schreiben (erfordert C-Code). Die API, die Sie implementieren müssen, ist Tk_CreateImageType, mit der Sie fünf Hauptaspekte von Bildern anpassen können (wie sie erstellt, in einem anzeigbaren Kontext installiert, gezeichnet, vom Kontext freigegeben und gelöscht werden). Mir wurde gesagt - aber ich kann zugegebenermaßen nicht aus Erfahrung sagen -, dass dies eine relativ einfache API ist, die implementiert werden kann. Ein Vorteil dabei ist, dass Sie nicht so viel Komplexität haben müssen, wie es beim Foto-Bildtyp der Fall ist (der alle Arten von Exotica beinhaltet, wie die Handhabung für seltene Anzeigetypen) und somit eine effizientere Datenstruktur und schneller verwenden können wird bearbeitet.

1

Wenn Sie sich Ihre Beispieldaten ansehen, sieht es so aus, als ob das, was Sie versuchen, in verschiedene Webtechnologien passen kann (entweder eine riesige Tabelle mit Hintergrundfarben oder mit dem HTML-Code <canvas>).Für Perl können Sie entweder mit einer der vielen Server-seitigen Web-Entwicklungstechniken arbeiten, oder Sie könnten etwas wie XUL::Gui verwenden, welches ein Modul ist, das hauptsächlich Firefox (oder andere unterstützte Browser) als GUI-Rendering-Engine verwendet für Perl.

Hier ist ein kurzes Beispiel zeigt, wie das <canvas> Element verwenden (in diesem Fall ein Sierpinski Dreieck zu zeichnen, aus den Beispielen des Moduls):

use strict; 
use warnings; 
use XUL::Gui 'g->'; 

my $width = 400; 
my $height = sqrt($width**2 - ($width/2)**2); 

g->display(
    g->box(
     g->fill, 
     g->middle, 
     style => q{ 
      background-color: black; 
      padding:   40px; 
     }, 
     g->canvas(
      id  => 'canvas', 
      width => $width, 
      height => int $height, 
     ) 
    ), 
    g->delay(sub { 
     my $canvas = g->id('canvas')->getContext('2d'); 
     $canvas->fillStyle = 'white'; 

     my @points = ([$width/2, 0], 
      [0, $height], [$width, $height], 
     ); 
     my ($x, $y) = @{ $points[0] }; 
     my $num = @points; 
     my ($frame, $p); 
     while (1) { 
      $p = $points[ rand $num ]; 
      $x = ($x + $$p[0])/2; 
      $y = ($y + $$p[1])/2; 

      # draw the point with a little anti-aliasing 
      $canvas->fillRect($x + 1/4, $y + 1/4, 1/2, 1/2); 

      if (not ++$frame % 1_000) { # update screen every 1000 points 
       $frame % 100_000 
         ? g->flush 
         : g->doevents # keeps firefox happy 
      } 
     } 
    }) 
); 
+0

Nein-nein-nein. Es ist nicht für das Web. Es ist ein Werkzeug für C-Programmierer, es kann genau wie xvcg sein (was hässlich X-Anwendung ist) – osgx

+0

Die Daten sind keine Tabelle, es ist nur eine Menge langer Linien 1 Pixel Höhe. In jeder Zeile sind einige Punkte markiert. Im typischen Fall gibt es 23000 Zeilen. – osgx

+0

gibt es auch ein Tag Tk, das nicht für das Web ist – osgx

Verwandte Themen