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);
einfachLineTo(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 erstellenzum 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 nichtsoder 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 154d.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!