GDI+ Bmp vergrößert zeichnen



  • Hi,
    Ich benutze GDI+ mit Borland C++ Builder 6. Ich will eine Bitmap (40x40) auf 240x240 skalieren, d.h. versechsfachen. Was man am Bild http://www.virtualuna.de/temp/pixel.gif erkennen kann, ist
    1. das ausgabe Bild 237x237 Pixel Groß
    2. Der links obere Rand ist um 3 Pixel zu klein!

    void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
    {
      Gdiplus::Graphics gfx(PaintBox1->Canvas->Handle);
      Gdiplus::Graphics gfxb(Bmp);
      gfxb.DrawLine(&Gdiplus::Pen(Gdiplus::Color::Red), 0,0,40,40);
      Bmp->SetPixel(0,0, Gdiplus::Color::Purple);
      Bmp->SetPixel(1,1, Gdiplus::Color::Purple);
      Bmp->SetPixel(40,40, Gdiplus::Color::Purple);
      Bmp->SetPixel(39,39, Gdiplus::Color::Purple);
      Bmp->SetPixel(38,38, Gdiplus::Color::Purple);
      gfx.SetInterpolationMode(Gdiplus::InterpolationModeNearestNeighbor);
      Gdiplus::Rect destinationRect(0,0,240,240);
      gfx.DrawImage(Bmp, destinationRect, 0,0,40,40, Gdiplus::UnitPixel);
    }
    

    Warum weiß ich einfach nicht! Bin verzweifelt... Bitte helft mir!



  • Also GDI+ hat ansich nicht direkt mit der WinAPI zu tun, daher wird es wohl dauern bis Antworten kommen. Meine Vermutung ist aber das deine Paintbox vieleicht nicht die richtigen Abmessungen haben, oder das GDI sich nach einem anderen Koordinatensystem orientiert, setzte die Paintbox mal direkt am rand und mach die mal etwas geößer als 240x240, und mal schauen was dann passiert.



  • Das Problem ist gleich, nichts ändert sich, leider.
    Nur ist mir folgendes aufgefallen:
    Wenn ich die Draw Funktion Parameterübergabe so ändere

    gfx.DrawImage(Bmp, destinationRect, -3,-3,40,40, Gdiplus::UnitPixel);
    

    Dann sieht man zwar die links oberen Pixel richtig aber man sieht die unteren pixel dann nicht (das bild hat dann nur noch eine größe von 217x217 oder so).
    Dann habe ich folgendes probiert und so umgeändert:

    Gdiplus::Rect destinationRect(0,0,6*x,6*x);
    gfx.DrawImage(Bmp, destinationRect, -3,-3,x,x, Gdiplus::UnitPixel);
    

    Wie gesagt ist 6 der Zoomfaktor, und x ist eine beliebige Zahl, die jedoch größer oder gleich 43 sein muss, sonst entsteht das typische Bild wo Pixel fehlen, bei allen anderen werten klappt es dann richtig, also das bild ist auch 240x240 groß. Nur finde ich das etwas, naja sagen wir mal, "dreckig". Besonders deswegen weil ich nicht weiß warum?! Ich finde das ergibt überhaupt keinen Sinn.



  • Doch das hat einen Sinn, nähmlich der des "Nächstliegendes" Interpolator (heißt das so?), ich glaube beim zeichnen wird die letzte Spalte und Zeile nicht berücksichtig und beim vergrößern entsprechend dem Faktor : 2.
    Ich habe das jetzt nicht alles so drinn im Köpfchen, daher sehe das bitte alles als Vermutung an.
    Ich mein mich darann zu erinnern das beim Rendern, also drawImage() das immer berücksichtigt werden sollte.
    Habe leider nicht zu viel im schädel von GDI+, da ich es nie verwende, ich benutze immer Ole


Anmelden zum Antworten