vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 23.03.18 18:29

Hallo!
Problem mit Ausgabe in PictureBox
Ich habe mit VB2010 ein Programm erstellt, mit dem ich Bilder im Bereich von -5 bis +5 Grad drehen kann.
Ausgabe des Bildes (W/H: 2816/1584) in eine PictureBox (W/H: 592/333, SizeMode: Zoom)
Sowohl die PictureBox als auch das zu drehende Bild und der Bildausschnitt haben ein Seitenverhältnis von 16/9.

Ausgabe: Grad W/H
0 2816/1584 1.77777…
-1 2720/1530 „
-2 2640/1485 „
-3 2576/1449 „
-4 2496/1404 „
-5 2432/1368 „

Mein Problem:
Bei den Gradzahlen 0, -2 und -5 wird die PictureBox nicht voll ausgefüllt
(Streifen von 1 Pixel rechts und unten)
Woran liegt das???
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 23.03.18 20:15

Hallo!

Ohne Kenntnis Deiner Rotationsroutine vermute ich:
Das liegt an der Rundung der Berechnungsergebnisse auf Ganzzahlen (=Pixel).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 23.03.18 20:44

Hallo,

die PictureBox rundet bei Zoom die Bildgröße auf ganze Zahlen. Dadurch kann sich eine Abweichung von 1 Pixel ergeben. Auch die BorderStyle-Einstellung kann das Bild verschieben.
Benutze besser StretchImage. Wenn die PictureBox das gleiche Seitenverhältnis hat wie das Originalbild, wird das Bild auch korrekt angezeigt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 25.03.18 10:10

Danke für Eure Antworten!
an der Rundung kann es nicht liegen...
siehe die Werte z.B. bei "-2"
Ich speichere das Bild als jpg-Datei -> Bild hat die gleichen Abmessungen (2640/1485)
Wenn ich das gespeicherte Bild wieder einlese -> wieder Streifen von 1 Pixel rechts und unten

Seitenverhältnis PictureBox: 592/333 - 1.77777...
Seitenverhältnis Bild: 2640/1485 - 1.77777...
-> Bild wird nicht korrekt angezeigt
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 25.03.18 12:48

Hallo!

Dein Befund ist völlig korrekt.
Ein derartiges Seitenverhältnis führt zu einem Randstreifen.
Der Zoomfaktor ist ist in dem Fall übrigens ein periodischer
Dezimalbruch: 4,459459459459459 ....

Die Borderstyle-Eigenschaft der Picturebox spielt z.B. auch
eine Rolle bei der Darstellung.

Public Class frmTestPicBox
 
    Dim pb As New PictureBox With 
        {.Parent = Me, .SizeMode = PictureBoxSizeMode.Zoom,
        .Location = New Point(10, 10), .Size = New Drawing.Size(592, 333)}
 
    Dim bmp As New Bitmap(2640, 1485)
 
 
    Private Sub frmTestPicBox_Load(sender As Object, 
        e As EventArgs) Handles MyBase.Load
 
        Me.Size = New Size(600, 400)
        Me.BackColor = Color.Yellow
        pb.BackColor = Color.Red
 
        Using g As Graphics = Graphics.FromImage(bmp)
            g.Clear(Color.Green)
        End Using
 
        pb.Image = bmp
 
    End Sub
End Class
Vielleicht so etwas ....
Public Class frmTestPicBox
 
    Dim pb As New PictureBox With {.Parent = Me, .SizeMode = _
      PictureBoxSizeMode.Zoom,
        .Location = New Point(10, 10), .Size = New Drawing.Size(592, 333), 
        .BorderStyle = BorderStyle.None}
 
    Dim bmp As New Bitmap(2640, 1485)
 
 
    Private Sub frmTestPicBox_Load(sender As Object, 
        e As EventArgs) Handles MyBase.Load
 
        Me.Size = New Size(600, 400)
        Me.BackColor = Color.Yellow
        pb.BackColor = Color.Red
 
        Dim bmp_out As New Bitmap(pb.Width, pb.Height)
        Using g As Graphics = System.Drawing.Graphics.FromImage(bmp_out)
            g.DrawImage(bmp, New Rectangle(0, 0, bmp_out.Width, bmp_out.Height))
        End Using
 
        pb.Image = bmp_out
    End Sub
 
 
End Class


Beitrag wurde zuletzt am 25.03.18 um 12:59:31 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 26.03.18 08:36

Hallo!
Dank für Deine Mühe!!!
Ich verstehe nicht warum mal mit mal ohne Streifen...

    Public Class frmTestPicBox
 
    Dim pb As New PictureBox With 
        {.Parent = Me, .SizeMode = PictureBoxSizeMode.Zoom,
        .Location = New Point(10, 10), .Size = New Drawing.Size(592, 333)}
 
    ' --> gleiche Seitenverhältnisse, aber... 
    ' Dim bmp As New Bitmap(2640, 1485)
      ' 2640:592=4.4594594... 2640:1485=1.77777...  --> mit Randstreifen
 
    Dim bmp As New Bitmap(2720, 1530)
      ' 2720:592=4.5944594... 2720:1530=1.77777...  --> o h n e Randstreifen
 
 
    Private Sub frmTestPicBox_Load 
       (sender As Object, e As EventArgs) Handles MyBase.Load
 
        Me.Size = New Size(628, 392)
        Me.BackColor = Color.Yellow
        pb.BackColor = Color.Red
 
        Using g As Graphics = Graphics.FromImage(bmp)
            g.Clear(Color.Green)
        End Using
 
        pb.Image = bmp
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 26.03.18 09:58

Entschuldigung:
' 2720:592= !!! 4.594594...!!! 2720:1530=1.77777... --> o h n e Randstreifen
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 26.03.18 11:26

Hallo!

Dazu kann ich nur folgende allgemeine Hinweise geben:

- Beim Vergrößern/Verkleinern von Bitmaps müssen alle Pixelpositionen
neu berechnet, interpoliert oder approximiert werden.
Dafür sind komplexe Algorithmen erforderlich.
Es entsteht ein neu aufgebautes Bild.

- Den Windows.Forms-Graphikroutinen liegen Bibliotheken (GDI+) aus dem
20.Jahrhundert zugrunde. Man kann die damit erzielten Resultate nur zur
Kenntnis nehmen. Zu verstehen gibt es nichts.
Pixel-Umrechnungen haben ohnehin notwendig immer eine Genauigkeitsgrenze.
Es kann auch passieren, daß eine Bild-Pixel-Reihe im Ziel-Bild abgeschnitten ist,
weil sie beim Interpolieren zu weit ausserhalb der vorgegebenen Fläche liegt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 26.03.18 17:44

Meine Rotationsroutine:

  Private Sub Rotate()
  Dim relPicIn, RelPic2 As Decimal
  Dim inW_half, inH_half As Decimal 
  Dim rotW_half, rotH_half, rotL, rotT As Decimal
  Dim theta As Double =  HScrollBar1.Value * PI / 180.0
    If theta < 0 Then theta *= -1 theta * -1
  Dim sin_theta As Double = Sin(theta)
  Dim cos_theta As Double = Cos(theta)
  inW_half = CDec(bmp_In.Width/2)
  inH_half = CDec(bmp_In.Height/2)
  rotW_half = CDec(Math.Floor(inW_half*cos_theta+inH_half*sin_theta))
  rotH_half = CDec(Math.Floor(inW_half*sin_theta+inH_half*cos_theta))
  rotL = CDec(rotW_half-inW_half*cos_theta+inH_half*sin_theta)
  rotT = CDec(rotH_half-(-inW_half*sin_theta+inH_half*cos_theta))
  bmp_Out = New Bitmap(CInt(2*rotW_half), CInt(2*rotH_half))
  Dim g As Drawing.Graphics = Graphics.FromImage(bmp_Out)
    g.Clear(Color.LightGray)
    Dim p_center As PointF
    p_center.X = rotW_half
    p_center.Y = rotH_half
    Dim m As New Drawing.Drawing2D.Matrix
      m.RotateAt(HScrollBar1.Value, p_center)
      g.Transform = m 
      Dim source_rect As New Rectangle(0, 0, bmp_In.Width, bmp_In.Height)
      Dim intX As Integer = CInt((bmp_Out.Width-bmp_In.Width)/2)
      Dim intY As Integer = CInt((bmp_Out.Height-bmp_In.Height)/2)
      Dim dest_rect As New Rectangle(intX,intY,bmp_In.Width,bmp_In.Height)
      g.DrawImage(bmp_In, dest_rect, source_rect, GraphicsUnit.Pixel)
    m.Dispose()
  g.Dispose()
  pb1.Image = bmp_Out
  RelPic2 = rotT/(2*rotW_half-rotL) 
  relPicIn = CDec(bmp_In.Height/bmp_In.Width)
   If relPicIn < 1 Then
    If relPicIn = pb1.Height/pb1.Width Then 
      out_rect.Width = CInt(Math.Floor(2*(rotH_half-rotT+rotW_half*RelPic2)/( _
        relPicIn+RelPic2)/16)*16)
    Else
      out_rect.Width = CInt(Math.Floor(2*(rotH_half-rotT+rotW_half*RelPic2)/( _
        relPicIn+RelPic2)))
    End                             |
    out_rect.Height = CInt(Math.Floor(out_rect.Width*relPicIn))
  Else
    out_rect.Height = CInt((2*(rotW_half-rotL+rotH_half*RelPic2)/( _
      bmp_In.Width/bmp_In.Height+RelPic2)))
    out_rect.Width = CInt((out_rect.Height/relPicIn))
  End If 
  out_rect.X = CInt(rotW_half-out_rect.Width/2)
  out_rect.y =  CInt(rotH_half-out_rect.Height/2)
  If bmp_Out.Height/bmp_Out.Width > pb1.Height/pb1.Width Then
    decZoom = CDec(bmp_Out.Height/pb1.Height)
  Else
    decZoom = CDec(bmp_Out.Width/pb1.Width)
  End If  
  If pb1.SizeMode = PictureBoxSizeMode.CenterImage Then decZoom = 1
  Dim ImagePart As Bitmap = New Bitmap(out_rect.Width, out_rect.Height)
  g = Graphics.FromImage(ImagePart)
    Dim TargetRect As Rectangle = New Rectangle(0, 0, out_rect.Width, _
      out_rect.Height)
    g.DrawImage(bmp_Out, TargetRect, out_rect, GraphicsUnit.Pixel)
  g.Dispose
  g = Nothing
  pb2.Image = ImagePart         
  If chbVollbild.Checked = True Then pb1.Image = ImagePart
  End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 26.03.18 18:32

Im Code der Routine wird viel berechnet und danach gerundet.
Probier mal diese Variante (Transformationsmethode der Drawing2D.Matrix
bei Verarbeitung des Zoomfaktors):
http://www.vbarchiv.net/tipps/details.php?id=1871

Beitrag wurde zuletzt am 26.03.18 um 18:33:11 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 27.03.18 09:22

Hab die Variante „Bilder formatfüllend drehen und zoomen“ getestet.
Hier wird das Bild in einem Rechteck in voller Größe gedreht angezeigt. Aber auch hier bei manchen Winkeln Streifen von 1 Pixel an der rechten Seite.

Bei meiner Version wird aus dem gedrehten Bild nur ein Rechteck mit dem gleichen Seitenverhältnis ohne die Randbereiche ausgeschnitten und angezeigt. Daher muss mehr berechnet werden!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 27.03.18 09:33

Hallo!

Erstelle zuerst den gewünschten Bildausschnitt mit Graphics.DrawImage,
und rotiere im zweiten Schritt.
Damit ersparst Du Dir die Berechnungen.

Alternativ kannst Du es mit WPF versuchen.
Hinter diesen Controls steht ein modernes Graphiksystem.
Sie können auch in WinForms-Projekten eingesetzt werden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 27.03.18 16:29

Hallo,

ich habe dieses Beispiel ausprobiert und kann den Streifen rechts und unten bestätigen. Er tritt nur bei bestimmten Bildgrößen auf. Die Ursache ist mir unbekannt. Das interne, gezoomte Bild scheint immer die richtige Größe zu haben. Wenn ich den Originalcode der PictureBox nachbilde (mit DrawImage), tritt in keinem Fall ein Streifen auf.
Beste Lösung:
Erstelle ein eigenes Steuerelement.

Mit dieser PictureBox tritt kein Randstreifen auf.
Class MeinePictureBox
  Inherits PictureBox
 
  Protected Overrides Sub OnPaint(pe As PaintEventArgs)
    If Image IsNot Nothing AndAlso SizeMode = PictureBoxSizeMode.Zoom Then
      pe.Graphics.DrawImage(Image, ImageRectangle)
    Else
      MyBase.OnPaint(pe)
    End If
  End Sub
 
  Private Function ImageRectangle() As Rectangle
    Dim cr = ClientRectangle
    If Image IsNot Nothing Then
      Dim ims = Image.Size
      Dim ratio = Math.Min(cr.Width / ims.Width, cr.Height / ims.Height)
      cr.Width = CInt(ims.Width * ratio)
      cr.Height = CInt(ims.Height * ratio)
      cr.X = (Me.Width - cr.Width) \ 2
      cr.Y = (Me.Height - cr.Height) \ 2
    End If
    Return cr
  End Function
 
End Class
Du kannst das drehen des Bildes auch direkt mit in diese Box einbauen.
Zum Beispiel so:
  Protected Overrides Sub OnPaint(pe As PaintEventArgs)
    If Image IsNot Nothing AndAlso SizeMode = PictureBoxSizeMode.Zoom Then
      Dim g = pe.Graphics
      'Verschieben zum Mittelpunkt
      g.TranslateTransform(Me.Width / 2.0F, Me.Height / 2.0F)
      'Drehen um 5 Grad
      g.RotateTransform(5.0F)
      'Grafik vergrößern, damit keine Ränder sichtbar sind
      '(der genaue Faktor muss berechnet werden!)
      g.ScaleTransform(1.2F, 1.2F)
      'Zurückverschieben
      g.TranslateTransform(-Me.Width / 2.0F, -Me.Height / 2.0F)
      'Qualität verbessern
      g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
      'Bild zeichnen
      g.DrawImage(Image, ImageRectangle)
    Else
      MyBase.OnPaint(pe) 'internes zeichnen
    End If
  End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 28.03.18 12:03

Vielen, vielen, vielen Dank !!!

Ich habe [Class MeinePictureBox] eingefügt --> ich verstehe nicht warum… aber funktioniert einwandfrei!!!
Aber: Paint-Ereignis funktioniert nicht mehr. Wie kann ich auf das Paint-Ereignis zugreifen?


Private Sub myPb1_Paint _
  (sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles pb1.Paint
 
If out_rect.Width = 0 Then Exit Sub ' nach Load -> Exit Sub
 
Dim pbRectOut As Rectangle     
 
'*** Ausgabe-Rechteck 
' **************************************************************
  pbRectOut.X = CInt((myPb1.Width - out_rect.Width / decZoom) / 2) 
  pbRectOut.Y = CInt((myPb1.Height - out_rect.Height / decZoom) / 2
  pbRectOut.Width = CInt(out_rect.Width / decZoom
  pbRectOut.Height = CInt(out_rect.Height / decZoom
 
  If chbVollbild.Checked = False And HScrollBar1.Value <> 0 Then
    e.Graphics.DrawRectangle(Pens.White, pbRectOut)
  End If
 
'*** Diagonalen 
' ********************************************************************
  If chbDiagonalen.Checked = True And HScrollBar1.Value <> 0 And _
    chbVollbild.Checked = False Then
    Dim PenDiag As Pen = New Pen(Color.White)
    PenDiag.DashStyle = DashStyle.DashDotDot
    Dim pntD(3) As Point
 
    pntD(0).X = CInt((myPb1.Width - bmp_In.Width / decZoom) / 2)
    pntD(0).Y = CInt((myPb1.Height - bmp_In.Height / decZoom) / 2)
    pntD(1).X = CInt(pntD(0).X + bmp_In.Width / decZoom)
    pntD(1).Y = pntD(0).Y
    pntD(2).X = pntD(0).X
    pntD(2).Y = CInt(pntD(0).Y + bmp_In.Height / decZoom)
    pntD(3).X = pntD(1).X
    pntD(3).Y = pntD(2).Y
    e.Graphics.DrawLine(PenDiag, pntD(0), pntD(3))
    e.Graphics.DrawLine(PenDiag, pntD(1), pntD(2))
 
    e.Graphics.DrawLine(PenDiag, pntD(0), pntD(1))
    e.Graphics.DrawLine(PenDiag, pntD(1), pntD(3))
    e.Graphics.DrawLine(PenDiag, pntD(3), pntD(2))
    e.Graphics.DrawLine(PenDiag, pntD(2), pntD(0))
  End If
 
'*** Raster 
' ************************************************************************
  If chbRaster.Checked = True Then
    . . .
  End If
  End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 28.03.18 15:17

Bei meinem Beispiel wird das Paint-Event nur ausgelöst, wenn die SizeMode der Picturebox nicht Zoom ist.

So wird das Paint-Event immer ausgelöst, hat aber zur Folge, dass das Bild der Image-Eigenschaft 2x gezeichnet wird:
Protected Overrides Sub OnPaint(pe As PaintEventArgs)
  If Image IsNot Nothing AndAlso SizeMode = PictureBoxSizeMode.Zoom Then
    pe.Graphics.DrawImage(Image, ImageRectangle)
  End If
  MyBase.OnPaint(pe)
End Sub
Bessere Lösung:
  Shadows Event Paint As PaintEventHandler
 
  Protected Overrides Sub OnPaint(pe As PaintEventArgs)
    If Image IsNot Nothing AndAlso SizeMode = PictureBoxSizeMode.Zoom Then
      pe.Graphics.DrawImage(Image, ImageRectangle)
    Else
      MyBase.OnPaint(pe)
    End If
    RaiseEvent Paint(Me, pe)
  End Sub
So klappts auch mit dem Paint-Event.

Beitrag wurde zuletzt am 28.03.18 um 15:22:43 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Dikn
Datum: 28.03.18 18:01

nochmals vielen Dank für Deine Bemühungen!!!
jetzt funktioniert alles wunderbar

Gruß
DiKn
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 04.04.18 07:06

Ursache gefunden!

Gerade hatte ich eine Idee, was wohl die Ursache für den 1 Pixel Rand sein könnte. Ich habe nun diese Idee überprüft und die Ursache gefunden.
Wie ich schon vermutet hatte, ist es ein Rundungsfehler. Bei der Nachbildung der Picturebox in VB tritt dieser Fehler aber nicht auf.
Die Ursache liegt an C#!
Bei der Konvertierung von Single in Integer rundet VB (aus 23,7 wird 24), aber C# rundet nicht, es schneidet nur die Nachkommastellen ab (aus 23,7 wird 23)!
Da die Picturebox in C# und nicht in VB geschrieben wurde, ergibt sich daraus dieser Pixelfehler.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 04.04.18 13:37

Meines Wissens beruhen die klassischen Windows.Forms-Controls
auf uralten Windows-Controls des letzten Jahrhunderts.
Mit C# haben sie deshalb nichts zu tun.

Es liegt vermutlich ein Algorithmus-bedingtes Phänomen vor,
das unter bestimmten Bedingungen die pixelgenaue Erstellung
vergrößerter oder verkleinerter Bitmaps verhindert.
Es scheint so, daß in solchen Fällen entweder die Größe des
Resultat-Bildes abgerundet oder das Bild am Rand abgeschnitten
wird (Graphics-Klasse).

Mit einer einfachen Rundungsoperation läßt sich das nicht
begründen. Im übrigen arbeiten Framework-Klassen intern nicht
sprachspezifisch.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 04.04.18 20:18

Hallo Manfred X,

da liegst du leider falsch. Schau dir den Originalcode der Picturebox an, besonders die Funktion "ImageRectangleFromSizeMode". Wenn ich diese Funktion unter C# ausführe kommt es bei bestimmten Seitenverhältnissen zu dem von Dikn beschriebenen 1 Pixel Rand. Also in dem Beispiel von Dikn, bei einer Picturebox-Größe von 592x333, bekomme ich dann eine Größe von 591x332. Die Picturebox benutzt DrawImage mit diesem Rechteck.
Führe ich die gleiche Funktion (umgeschreiben) in VB aus, so erhalte ich immer die richtige Größe von 592x333. Auch ein Auslesen des internen Rechtecks über Reflektion ergibt die gleiche Abweichung.

VB:
Dim s As Single = 23.7F
Dim i As Integer = CInt(s) ' = 24
C#:
float s = 23.7f;
int i = (int)s; // = 23
Du kannst es selbst ausprobieren!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 04.04.18 20:51

Hallo!

Ich hab mal reingeschaut.
Worauf Du Dich beziehst, ist nicht der "Originalcode der Picturebox",
sondern nur der verwaltete Code, über den das native Control "gefahren"
wird.

Selbstverständlich muß dieser Code die Property-Werte in Net so zurückliefern,
wie das native Control die Bilder z.B. beim Zoomen darstellt.
Die Codezeilen auf die Du dich beziehst sind - soweit ich gesehen habe -
deshalb nur die Folge, aber nicht die Ursache des Problems. Das liegt in der Box
selbst.

Beitrag wurde zuletzt am 04.04.18 um 21:01:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 04.04.18 21:10

Hallo,

welches native Control soll denn die PictureBox sein? Sie erbt, wie jedes andere Steuerelement von Control! Und Control ist auch kein natives Steuerelement.
Die PictureBox zeichnet die Bilder mit DrawImage!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 04.04.18 21:40

(Nahezu) Alle Graphik-Klassen in Windows.Forms erben von der Klasse
System.MarshalByRefObject und das bedeutet, die intern verwendeten
Bibliotheken sind kein Teil des Net-Framework.
(Picturebox, Graphics, Matrix, Image/Bitmap, ...)

Aus diesem Grund müssen z.B. alle GDI-Ressourcen im Code "Disposed"
werden. Sie laufen nicht im verwalteten Speicher, die GDI-Handles werden
nicht automatisch vom Framework (Garbage Collector) freigegeben usw.

Auch Formulare, die häufig in der Anwendung Neu instanziiert werden,
sollten die enthaltenen Controls im Close-Eventhandler Disposen.

Windows umfaßte - von Anfang an ?? - grundlegende Controls, die nicht
modifiziert worden sind und die bis heute (und in Zukunft) in Windows.Forms
genutzt werden.

https://stackoverflow.com/questions/16183195/are-basic-net-windows-forms-controls-native-win32-controls

Man kann das WPF-Control "Image" einfach in Winforms-Anwendungen hosten
(ElementHost) und hat dann Zugriff auf moderneres "Material".

Beitrag wurde zuletzt am 04.04.18 um 21:53:17 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 04.04.18 22:52

Das hat aber gar nichts damit zu tun, dass die interne Funktion "ImageRectangleFromSizeMode", bei bestimmten Seitenverhältnissen, ein Rechteck zurück gibt was 1 Pixel kleiner ist, weil eben C# generell abrundet.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 04.04.18 23:02

Was soll die Routine zurückgeben?
Einen aufgerundeten Wert, der nicht kompatibel ist
mit dem Ergebnis der zugrundeliegenden Methode?

Ich denke, Deine Recherchen sind nutzlos, weil wir nichts
darüber wissen, wie das Control intern arbeitet.

Im Übrigen: Falls es möglich wäre, das Problem im Net-Code
zu beheben, hätten die Net-Entwickler das längst erledigt.

Meine Vermutung: Es ist eine Sicherheitslösung. Bei Aufrundung
wird nämlich das resultierende Bild (GDI+) manchmal zu groß und
deshalb vom Picturebox-Control am Rand des Bildes eine Pixelreihe
abgeschnitten.

Beitrag wurde zuletzt am 04.04.18 um 23:06:53 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Kuno60
Datum: 04.04.18 23:20

Du hast keine Ahnung von C# und verstehst den .NET-Framework-Sourcecode nicht...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem mit Ausgabe in PictureBox 
Autor: Manfred X
Datum: 04.04.18 23:33

Dann ist es ja gut, daß wir hier jemanden haben,
der so enorm kompetent ist wie Du.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel