TImage zoomen und PenPos anpassen



  • Beim Zoomen eines Bildes im TImage geh ich folgendermaßen vor:

    Graphics::TBitmap *VergrPict = new Graphics::TBitmap();
        VergrPict->Width = Image->Width;
        VergrPict->Height = Image->Height;
        VergrPict->Assign(Image->Picture);
        Image->Width = Image->Width*1.2;
        Image->Height = Image->Height*1.2;
        // Image->Picture->Graphic->Width = Image->Width;
        // Image->Picture->Graphic->Height = Image->Height;
        Image->Canvas->StretchDraw(Image->Canvas->ClipRect,VergrPict);
    

    Die auskommentierten Zeilen würden PenPos richtig setzen. Ich will aber beim Zoomen die Bildgröße nicht real verändern, kann die Werte also nicht zuweisen.

    Nun hab ich ein Prob, zu dem ich bisher nichts gefunden hab: PenPos weicht von der Cursor-Position ab. Mit Umrechnungsversuchen hatte ich kein Glück. Weiß jemand, wie ich PenPos korrigieren kann? Sie soll der Cursor-Position entsprechen.



  • Seh ich das richtig, dass du praktisch nur die Cursor-Position wissen musst?

    Die kriegst du über TMouse.



  • TMouse hab ich gar nicht als Klasse (BCB3). Der Effekt ist ganz eigentümlich. Canvas->Pen->Width stimmt relativ zu den großgezoomten Bildpixeln. Ich könnte einwandfrei zeichnen. Aber der Point(X,Y) ist in der Diagonalen um einiges vom Cursor entfernt. Die Wirkung ist überproportional. Nur an einem Punkt im Bild stimmen Cursor-Position und Point(X,Y) überein. Je weiter ich davon weggeh, desto unproportional größer wird der Unterschied.

    Ich vermute, daß ich ganz einfach falsch zoome. Aber alle Versuche, es besser zu machen, lassen das Bild auch die reale Größe ändern. Und das soll ja nicht sein.



  • Schade. Ich hatte gehofft, daß schon mal jemand ein Maltool gebaut hat.

    Aber vielleicht ist noch ein Punkt von Interesse? Ich setze Image->Stretch auf true und vergrößer das Image zur Laufzeit. Will ich dann im OnMouseDown die Zeichenarbeit starten, springt das Image wieder auf seine 100%-Größe zurück. Diesen Effekt kannte ich nicht, als ich Zooming damals unter WIN95 eingerichtet hatte. Unter WIN98 gelingt mir Zoomen auf keinem Weg mehr. Ich weiß an dem Punkt echt nicht weiter. Bin für jeden Tip dankbar, auch wenn er erst mal nichts bringt. Erfahrung wird es in jedem Fall gewesen sein. 🙂



  • Also gut, dann ärger ich mich eben über jeden gut gemeinten Tip. Will ja kein Spielverderber sein. :p Es kann doch unmöglich angehen, daß man mit dem BCB kein Malprogramm bauen kann. Oder ist es doch Wahrheit? Dann "armer BCB". 😞



  • Original erstellt von <Omega-X>:
    Also gut, dann ärger ich mich eben über jeden gut gemeinten Tip. Will ja kein Spielverderber sein. :p Es kann doch unmöglich angehen, daß man mit dem BCB kein Malprogramm bauen kann. Oder ist es doch Wahrheit? Dann "armer BCB". 😞

    Wenn, dann kannst du mit dem BCB kein Malprogramm bauen.



  • Das heißt im Kehrschluß, es geht sehr wohl, *freu*. Aber warum sagt niemand mal so 'ne Klitzekleinigkeit? @Eßer hat doch auch nicht mit Zurückhaltung verwöhnt.

    Was mach ich falsch, oder was sollte ich ganz anders anpacken? Ich hab wirklich mein bescheidenes Pulver verschossen.



  • Tut mir Leid, aber auch nach längerem Lesen verstehe ich dein Problem nicht ganz.

    Du vergrößerst also ein Bild. Danach stimmt PenPos natürlich nicht mehr, bzw. PenPos ist im Bild ein anderer Punkt.

    Du meinst, das liegt am falschen Zoomen? Ich würde sagen, das ist ganz normal.

    Jetzt hast du zwei Möglichkeiten:
    1.: PenPos direkt umrechnen
    2.: PenPos über die Cursor-Position (GetCursorPos()) errechnen

    Um Mathe kommst du also wohl nicht herum. 😉



  • @Omega: Man, ist doch klar: du vergrößerst mit dem Streckfaktor 1.2. Dann musst du auch die PenPos so umrechnen:

    int x = (int)((float)Image->Canvas->PenPos.x * (float)1.2);
    int y = (int)((float)Image->Canvas->PenPos.y * (float)1.2);
    Image->Canvas->PenPos = Point(x,y);
    

    Das ist kein Mathe, sondern Rechnen!

    [ Dieser Beitrag wurde am 18.02.2003 um 23:06 Uhr von WebFritzi editiert. ]



  • <edit>Glaub nicht, daß ich mich vor Köstlichkeiten drücken will, @Eßer. Bin nicht der Typ, der Langeweile zur Passion machen würde. :p Also niemals Anns vor den Aufgabenstellungen. - Genau die Umrechnung ist das Prob. Nichts scheint wirksam zu sein. Vergrößer ich, erfolgt die Zeichenoperation schräg rechts unterhalb vom Corsor. Verkleiner ich, wird schräg links oberhalb vom Corsor gezeichnet. Bei GetCursorPos() streikt die Suche. Aber mit Canvas->PenPos sollte es ja klappen können.

    @WebFritzi, die Kombi mit int und float ist wieder mal ein Leckerbissen. Doch leider. Der Code greift weder in der Function noch im OnMouseDown des TImage. Daß rein gar nichts wirksam zu sein scheinen will, irritiert mich. Zur Demo hab ich aus der 1.2 mal eine 200 gemacht. Das gleiche Ergebnis.

    // im Constructor
    Graphics::TBitmap *VergrPict = new Graphics::TBitmap();
    void __fastcall TPixi::ZoomOutBtnClick(TObject *Sender)
    {
        VergrPict->Width = Image->Width;
        VergrPict->Width = Image->Width;
        VergrPict->Height = Image->Height;
        VergrPict->Assign(Image->Picture);
        Image->Width = Image->Width*1.2;
        Image->Height = Image->Height*1.2;
        Image->Canvas->StretchDraw(Image->Canvas->ClipRect,VergrPict);
        FormResize(Sender); // zentriert das Bild im Fenster
        int x = (int)((float)Image->Canvas->PenPos.x * (float)200);
        int y = (int)((float)Image->Canvas->PenPos.y * (float)200);
        Image->Canvas->PenPos = Point(x,y);
    }
    //---------------------------------------------------------------------------
    void __fastcall TPixi::ZoomInBtnClick(TObject *Sender)
    { 
        VergrPict->Width = Image->Width;
        VergrPict->Height = Image->Height;
        VergrPict->Assign(Image->Picture);
        if (Image->Width >= 30 && Image->Height >= 30)
        {
            Image->Width = Image->Width*0.8; 
        }
        if (Image->Width >= 30 && Image->Height >= 30)
        {
            Image->Height = Image->Height*0.8;
        }
        Image->Canvas->StretchDraw(Image->Canvas->ClipRect,VergrPict);
        FormResize(Sender); // zentriert das Bild im Fenster  
        int x = (int)((float)Image->Canvas->PenPos.x * (float)0.8);
        int y = (int)((float)Image->Canvas->PenPos.y * (float)0.8);
        Image->Canvas->PenPos = Point(x,y);   
    }
    

    Von außerhalb wohl nicht nachvollziehbar, aber vielleicht kann die Erfahrung etwas vermuten? Hebel ich die Wirksamkeit ggf. durch eine Standardmaßnahme aus? Canvas->PenPos hab ich in der ganzen App aber nur an dieser einen Stelle definiert.



  • Also, ich verstehe nicht, was du überhaupt willst. Was faselst du die ganze Zeit vom Cursor? Meinst du den Mauscursor? Was hat der damit zu tun?



  • Ja, ich mein den Mauscursor. Der ist doch mein Malwerkzeug. OnMouseDown im TImage, von dort aus soll die Zeichenoperation starten. Doch gezeichnet wird schräg unterhalb des Mauszeigers. Die aktuelle Zeichensituation und der Mauszeiger sollen doch übereinstimmen. Und das tun sie eben nicht. Auch mit dem eingefügten Code tun sie es nicht. Ich hatte schon ähnliche Versuche unternommen.



  • Achso, du meinst also,

    void __fastcall TForm1::OnImageMouseDown(..., int X, int Y, ...)
    {
       Image->Canvas->PenPos = Point(X, Y);
    }
    

    geht nicht?



  • Nein, geht nicht. Auch eine korrigierende Berechnung bleibt wirkungslos.

    Ist meine Methode zu Zoomen doch falsch? Es besteht ja eine Abweichung zwischen Image->Width und Image->Picture->Graphic->Width. Aber ich darf das IMHO nicht korrigieren, sonst veränder ich die reale Bildgröße (mehrfach probiert).



  • Hmmm..., ich wage inzwischen nicht mehr, dran zu glauben, daß das Prob mit BCB-Mitteln in den Griff bekommbar ist. Hab die Frage also auch im API-Board gestellt. Doppelpost ist damit natürlich nicht gemeint. Aber es gibt defakto eine Lösung, sogar M$Paint kennt sie. 😃 Ich hoffe, daß sie jemand kennt oder daß sich der Weg erarbeiten läßt.

    Dank euch auf jeden Fall schon mal für eure Mühe und die gute Hilfe. Wenn sich nichts bewegt, hexen kann ja niemand. Wenn doch noch jemand eine Idee hat, hemmungslos her damit. 🙂 Und keine Anns, das Wort "redundant" würde von mit persönlich mit allerschlimmster Folter geahndet. 😃



  • ... dann muß der Berg eben zum Propheten kommen... dachte ich (bin aber wohl kein Pferd).

    Origin = Point((X)/(float)0.8,(Y)/(float)0.8);
        MovePt = Point((X)/(float)0.8,(Y)/(float)0.8);
    

    steht nun ich der OnMouseDown des TImage, als hätte ich es nie geschrieben. Es ist wirkungslos.

    Das API-Board ist auch wirkungslos.

    Dto. ein weiteres Forum.

    Ich kann keine sinnvolle Grafikanwendung bauen. Offenbar kann niemand eine sinnvolle Grafikanwendung bauen.

    Niemand? Oh, hab ich google durchwühlt. Scheinbar... "niemand" stimmt.

    Oh wär ich doch Bienenzüchter geworden. Denn ein "geht nicht" ist ein "geht nicht", bleibt ein "geht nicht".

    Gilt das für alle? Oder gilt das nur für unlizenzierte, die aber mit ihrer IDE sehr wohl eine Lizenz erworben haben? Also castriert um das große Doppelabzockens durchpeitschen zu können?

    Oder kann mir jemand beweisen, daß das alles Blödsinn ist, was ich hier geschrieben hab?



  • Sacht mal Leute, das ist ja schon der pure Abkocheffekt. Ich seh immer wieder, wie Leute aus ihrer eigenen Grafikpraxis heraus gezielte Hilfe geben. Auch ich bekam solche Hilfe. Es wird betont, daß ich nicht in der Lage sei, ein Grafikprogramm zu bauen. LnL, ihr beschäftigt euch ernsthaft mit der IDE. Sowas tut ein erwachsener Mensch nicht, wenn es nur läppischer halber Spielkram ist - es sei den, er hätte sich in ein traumatisches Pseudoparanoia hineinmanövriert.

    Einige von euch wissen also genau, wie man richtig an die Sache dran geht. Aber sie machen es zum gehüteten Geheimnis. Warum? Wichtigtuerei? Vor wem? Vor Leuten, die die vermeindlich sinnlose Spielwiese verlassen und das definitive Wissen mitnehmen, daß alles nur Augenwischerei, Gaukelei und Selbstberug ohne jeden wirklichen Wert ist?

    Dank noch mal an alle, die mir interessiert in irgendeiner Form, auch indirekt geholfen haben. Ich hoffe, ich konnte wenigstens ein klein wenig Ausgleich einbringen. Ich wünsch der Runde noch weiterhin gutes gelingen. Haltet euch wacker.

    Gruß
    Omega-X



  • Wie wär's mit

    Origin = Point(X,Y);
    MovePt = Point(X,Y);
    

    ? 😕



  • Dank dir sehr, @WebFritzi. Genau das hab ich doch im Original.

    Ansich bin ich mit dem Proggy über den Berg. Alles benötigten Drawtools, Invertieren, heller, dunkler, Bildgröße ändern, "neu" mit den benötigten Formaten, 'ne sehr große gut geschlossene und homogene Farbauswahl mit je 500 gesättigt, halb gesättigt, Copy und verschiebbares Paste, das MarkRect wird automatisch und zuverlässig bei jeder weiteren Aktion gelöscht... kurz, ein richtiges Arbeitstool, daß im Handling sogar mir richtig Spaß macht. Und ich bin da anspruchsvoll. Kein Schnickschnack, dafür hat die Maschine die immer wiederkehrenden Routinehandgriffe zu übernehmen. Usw.

    OnIdle, Open- und save-Routine sind dann schnell integriert. Ich hab je die Module bereits in anderen Apps. Das kommt am Schluß vor der ersten Fertigstellung. Und dann kommen auch solche Spezialitäten wie der Code, den du mir gegeben hast. Auf dieser Basis aufbauend läßt sich einiges machen. Dazu weiteres, was es noch zu entdecken gibt. Umrißmarkierung wäre später die hohe Schule. Also ein projekt, das für viele Jahre für Spannung und Spaß sorgen kann und viel lernen läßt. genau so mag ich das, so ist es edel.

    Und jetzt soll alles am Zoomen hängen? Ich tu so, als würde mich das gleichgültig lassen. In Wahrheit... aber der starke Trost ist das ultimative RPG-Projekt. Ein langer Weg mit sicher oft gnadenlosen Durststrecken, doch das Ziel wird die Mühe immer lohnen. - Und genau auf dieses Projekt wollte ich das Tool maßschneidern, ohne die Universalität einzuengen.

    Aber Grafik ohne Zoomen? Das geht einfach nicht. Und wenn ich was erarbeiten will, dann wiedersetzt sich mir höchstens eine Diktatur - sofern sie wirklich stark ist.

    Und hier scheint sie ultrastark zu sein. Denk nur an die Minipixel. Nein, ich träume nicht. Dies und das Zoomen gehen unter WIN98 einfach nicht. Denk mal: Als Starter hatte ich das einwandfrei ohne jedwede Hilfe hinbekommen. Richtig spielerisch ist es gelungen. Dabei hatte ich wirklich noch nicht die geringste Übersicht. Unter WIN95 war wohl noch nicht der Daumen drauf. Bei den Pixeln schmunzelt ihr, weil ihr zu dieser Zeit sowas nie ausgelotet habt. Nun geht es nicht mehr, ihr kennt es nicht.

    Aber Zoom kennen alle. Und hier wundere ich mich. Ich laß sowas nicht auf sich beruhen. Es gelingt, oder ich brauch das gesamte Umfeld nicht. Definitiv. Der Hersteller verkauft mir brauchbare Ware oder er geht pleite. Einmal kann er mich reinlegen, ein zweites mal gelingt es ihm nicht. Doch Borland wäre nur der Büßer. Da sind höhere Mächte am Ruder, die von den Millionen kritiklos und einseitig favorisiert und gekrönt wurden. Was geschieht, schmeckt ihnen nicht, doch sie fressen weiter, verkaufen sich weiter...

    Ole, hier ist nicht der Platz für Politik. Hier ist der Platz zum Arbeiten. Aber geht denn was? Ich wag nicht mehr dran zu glauben...



  • Man muß allerdings sagen, die einheimische Mentalität beinhaltet auch einen großen Bumerangeffekt. In den Borlangforen zB. gilt der Grundsatz, an einem Thema wird so lange gearbeitet, bis eine Lösung gefunden ist. Hatte bevor ich c-plusplus.net entdeckte bereits 3 Foren aufgegebnen. Eins hätte mir gut gefallen, auch wenn es sehr klein ist. Doch fast jeder Thread endete mit einer Frage. Hier allerdings bestehen solide Möglichkeiten.

    Wie gut oder schlecht werden sie genutzt? Dieses Beispiel zeigt zumindest eine seite der Wahrheit. Noch dazu in ausgeprägtester Form. Ich bin doch nicht der erste Mann auf dem Mond. Auch andere haben sich mit sicherheit an dem Thema schon versucht. Sie hatten für sich allein ebenfalls keinen Erfolg.

    Na und? Ist das ein Grund, nicht darüber zu sprechen? Allein das Wissen darum könnte die Energie zusammenbringen, am Thema weiter zu arbeiten. Natürlich hätte zB. ich jederzeit eine Übergangslösung parat. Aber wohl gemerxt Übergangslösung, ausschließlich dafür gedacht, die wirkliche Lösung zu finden. Auf Dauer will ich mich nicht für mein eigenes Mikriprogramm schämen müssen. Das geb ich mir nicht.


Anmelden zum Antworten