TImage zoom



  • guten morgen

    hab ein Programm geschrieben das ein "unbekanntest" Dateiformat einliest.

    Das Format besteht aus Tausenden von X, und Y Werten.
    (Stickformat .. Format für Stickmaschinen)

    ich gebe nun alle Werte in ein TImage aus.
    Mit der Funktion "LineTo"

    mein Problem ist nur wenn ich die Werte Ausgebe ist das Bild locker 1500pixel * 1200 pixel gross.

    Und da ich dem User soetwas nicht zumuten will will ich versuchen das Bild zu verkleinern.

    Meine erste Idee war

    anstatt

    LineTo(100,122);
    einfach

    LineTo(100/2.0, 122/2.0);

    zu benutzen.

    Allerdings wird das Bild dadurch verfällscht, d.h. es passt vorne und hinten nicht mehr zusammen.

    Hoffe jemand hat eine Idee.

    Mir wäre auch eine Komponente willkommen die soetwas kann.

    danke schonmal



  • Das Problem dürfte aus den unvermeidlichen Rundungsfehlern resultieren.

    Zeichne auf ein Offscreen-Bitmap in Originalgrösse und kopiere dieses dann per StretchDraw auf das Image. Oder weise es der Picture-Property des Image zu, bei gleichzeitig aktivierter Stretch-Option desselben.

    Aber was dein LineTo etc. betrifft, wäre es nicht einfacher und schneller, die Bilddaten per TBitmap::ScanLine oder zumindest per TCanvas::Pixels zu übertragen?



  • 1. was ist ein offscreen bitmap ?
    soll das heissen ich soll erstmal ein Bitmap erstellen

    zum thema geschwindigkeit

    ich hab momentan Dateien mit rund

    60.000 X/Y koordinaten offen und merke beim Zeichnen überhaupt nichts, d.h.
    Zeichnen-Button - Click -> Bild da

    // EDIT

    wäre noch nett wenn mir jemand nen denk-anstoss geben könnte ..

    TBitmap höre ich grad zum ersten mal

    jetzt hab ich mal folgendes Probiert
    Image1->Picture->Bitmap->Canvas->MoveTo(20,20);
    Image1->Picture->Bitmap->Canvas->LineTo(100,100);
    aber das zeichnet irgendwie gar nichts

    oder gibts es etwa eine Komponente die TBitmap heisst .. thx



  • h3nky schrieb:

    soll das heissen ich soll erstmal ein Bitmap erstellen

    Genau, eines, das halt nur im Speicher existiert.

    Ansonsten, ich war von 1500x1200=1.8 Mio Bildpunkten ausgegangen. 🙂
    Dass nur so wenig tatsächliche Bildinformationen enthalten sein könnten hatte ich nicht bedacht.

    Trotzdem deucht mich die LineTo-Variante höchst unelegant. Schliesslich lassen sich sowohl die Quelle als auch das Ziel als einfache zweidimensionale Arrays betrachten, und da liegt es doch nahe, die Informationen der einzelnen Bildpunkte direkt zu übertragen.



  • tjaha die einzelnen Bildpunkte übertragen 🙂

    Ich weiss nicht wie das einfacher gehen soll :>

    Daten auszug:

    x y

    10 102
    123 154

    d.h. ich MoveTo(10,102)
    und dann eben
    Lineto(123,154) ...

    woher soll ich wissen wo die ganzen einzelnen Bildpunkte liegen .. naja egal momentan gehts ja so

    zum Thema zoom habs jetzt so gemacht

    Image1->Picture->Bitmap->Canvas->MoveTo(20,20);
    Image1->Picture->Bitmap->Canvas->LineTo(100,100);

    TRect test(0,0,100,100);
    Image2->Canvas->StretchDraw(test,Image1->Picture->Bitmap);

    Allerdings musste ich vorher in das Image1 ein "weisses / leeres" Bitmap laden

    nur wie mach ich das später in meinem Programm, da ich ja nicht weiss wie groß die Dateien werden... d.h. wie kann ich dieses "weisse / leere" Bitmap selbst erzeugen.

    Denn wenn ich es vorher nicht auswähle sehe ich in meinem Image auch nichts.

    nochmal thx für alles :>



  • Ich denke, die Bildgrösse ist bekannt, z.B. 1500x1200?

    Ungetestet:

    Graphics::TBitmap *bmp = new Graphics::TBitmap();
    bmp->Width = 1500;
    bmp->Height = 1200;
    bmp->PixelFormat = pf1bit;
    
    bmp->Canvas->MoveTo(...);
    bmp->Canvas->LineTo(...);
    ...
    
    Image1->Stretch = true;
    Image1->Picture->Bitmap->Assign(bmp);
    
    delete bmp;
    

    Für die "direkte" Übertragung der Bildpunkte wäre es interessant, zu wissen, wie die Daten konkret vorliegen.



  • h3nky schrieb:

    ..nur wie mach ich das später in meinem Programm, da ich ja nicht weiss wie groß die Dateien werden...

    Lies einfach alle Koordinaten 'blind' durch und merk Dir:
    Minimum und Maximum fuer X und Y.

    Die Differenz ist die Bildgroesse! voila.



  • Das setzt natürlich voraus, dass es keinen "unbedruckten" Rand gibt ...



  • Das ist auch wieder wahr!

    Aber das kann mit 'nem Offset bei Stretchdraw korrigiert werden. Das Image muss natuerlich um die Randbreiten groesser gemacht werden!


Anmelden zum Antworten