Image scaling / Bitmaps proportional vergrößern oder verkleinern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Image scaling / Bitmaps proportional vergrößern oder verkleinern

    Hallo!

    Ich hab nu wieder ein hoff. kleines Problemchen.

    Ich habe mir ein kleines Programm gebaut welches mir auf einer PictureBox ein Schriftzeichen in einer frei wählbaren Schriftart ausgibt.
    Nun kann ich mit den AForge-Bibliotheken das eingrenzende Rechteck des Zeichens finden, ausschneiden und neu zeichnen etc.

    Mein Problem ist nun wenn ich zB. den Buchstaben "J" darstelle hat dieser zB. eine Höhe von 75 Pixel und eine Breite von 20 Pixel.
    Da ich jedes Zeichen zur Weiterverarbeitung auf ein einheitliches Maß bringen will, wie zB. eine Max. Höhe bzw. Max. Breite von 50 Pixel,
    hab ich versucht nun von der Höhe die Differenz zu 50 abzuziehen! Das wären also 25 Pixel..
    ..nun muss ich aber, um die Proportion zu wahren, in der Breite ja auch 25 Pixel abziehen!

    Das führt dazu das der Buchstabe "J" Spiegelverkehrt dargestellt wird, also mit -5 Pixel..

    Wie kann ich denn meine Bitmaps skalieren ohne solchen Effekt?
    Hab jetzt schon an Vektorgrafiken gedacht!?

    Dies ist meine "Scale-Funktion":

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function _scale(ByVal _rectBitmap As Bitmap, ByVal _desiredMaxBlob As Integer, ByVal _desiredMaxBitmap As Integer) As Rectangle
    2. Dim _scaledRectangle As Rectangle
    3. Dim _diff As Integer = Nothing
    4. If _rectBitmap.Width > _rectBitmap.Height Then 'breiter als hoch
    5. _diff = _desiredMaxBlob - _rectBitmap.Width
    6. Else 'höher als breit
    7. _diff = _desiredMaxBlob - _rectBitmap.Height
    8. End If
    9. Debug.WriteLine(_diff)
    10. Debug.WriteLine(_rectBitmap.Width + _diff & "x" & _rectBitmap.Height + _diff)
    11. _scaledRectangle.Width = _rectBitmap.Width + _diff
    12. _scaledRectangle.Height = _rectBitmap.Height + _diff
    13. _scaledRectangle.X = CInt((_desiredMaxBitmap / 2) - (_scaledRectangle.Width / 2))
    14. _scaledRectangle.Y = CInt((_desiredMaxBitmap / 2) - (_scaledRectangle.Height / 2))
    15. Return _scaledRectangle
    16. End Function


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Nur mal nebenbei: Ist das nicht eher ne Beschneidungsfunktion, was Du da beschreibst? Man subtrahiert doch nicht für ne Skalierung um einen Wert, sondern dividiert. So kommt man von 75 auf 50 und von 20 auf 13, also jeweils 2/3. Oder für die vollständige Rechnung eben:
    ScaleFactor = DesiredHeight / ActualHeight
    DesiredWidth = ActualWidth * ScaleFactor
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Morrison So ganz einfach ist das nicht.
    Bedenke, dass Buchstaben einen Mittelbereich haben und noch einen Ober- und einen Unterbereich haben können.
    Das "o" hat nur einen Mittelbereich.
    Das "f" hat einen Mittel- und einen Oberbereich.
    Das "g" hat einen Mittel- und einen Unterbereich.
    In der Schreibschrift kann das "J" über alle 3 Bereiche ausgedehnt sein.
    Du musst dann aufpassen, dass die Linien, die den Mittelbereich eingrenzen, überall gleich sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!