Bildmasse (Breite und Höhe in Pixel) falsch

  • VB.NET

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

    Bildmasse (Breite und Höhe in Pixel) falsch

    Guten Tag allerseits

    Bin hoffentlich hier richtig und habe nichts übersehen, was es zum Thema schon gibt.

    Meine Bildmasse (Breite und Höhe in Pixel) sind falsch, wenn ich versuche, diese auzulesen, was ich etwa wie folgt versuche

    VB.NET-Quellcode

    1. For Each fi As System.IO.FileInfo In di.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
    2. Dim Img As Image = Image.FromFile(fi.FullName)
    3. Dim intBBreite As Integer = Img.Width
    4. Dim intBHoehe As Integer = Img.Height
    5. ' Hier dann Ausgabe und weitere Bearbeitungen
    6. Next


    Nun sind schon die Werte bei "Img.Width" und "Img.Height" falsch. Mal um den Faktor 1,56 mal um den Faktor ca. 10.

    Was mache ich falsch, so dass ich nicht auf die gleichen Werte (Breite und Höhe in Pixel) wie jedes Bildanzeige-Programm komme. Beispiel-Datei anbei. Hier komme ich anstatt auf 317 x 255 auf 3300 x 2652.

    Im Voraus besten Dank.

    PS: Bei meinen Beispielen ging es zwar um WMF-Dateien (werden nicht zum Hochladen akzeptiert), das Problem ist aber auch bei JPG das gleiche.
    Bilder
    • AD000021.jpg

      22,17 kB, 317×255, 66 mal angesehen

    tamaleus schrieb:

    Hochladen
    Du kannst sie zippen und anhängen.
    Dieser Code funktioniert bei mir exakt.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Vielen Dank mal für die Antwort.
    Hast Du denn eine Idee, woran das noch liegen könnte, dass ich hier überall bei allen Bildern falsche Ergebnisse erhalte?
    Gibt es da noch irgend wo irgend eine Grund-Einstellung oder ein nötiges Element?

    tamaleus schrieb:

    Idee
    Nein.
    Poste mal Deine Vektorbilder als ZIP.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Habe zwischenzeitlich erfolgreich eine Reparatur von Visual Studio Express 2013 durchgeführt mit dem Ergebnis, dass nun die bisher auftauchende Meldung, wenn man ein Projekt geöffnet hat, dass NuGetVSEventsPackage nicht richtig installiert sei, nun nicht mehr angezeigt wird, ich aber nach wie vor die gleich falschen Bild-Grössen für Breite und Höhe erhalte. Wie gesagt: Anstatt 317 x 255 Pixel werden mir bei dem Beispiel-Bild AD000021.WMF 3300 x 2652 Pixel ausgegeben, bzw. angezeigt. Und zwar egal, ob WMF oder JPG.

    tamaleus schrieb:

    3300 x 2652
    hab ich bei der WMF auch:

    Allerdings ist das ne Vektorgrafik, und die würde ich mal in nem Vektorprogramm ansehen, hab ich leider nicht.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @3daycliff Jou.
    @tamaleus Da wir keine halben Pixel haben, machen wir das so:

    VB.NET-Quellcode

    1. Dim path = "C:\Temp\AD000021.WMF"
    2. Dim img As Metafile = New Metafile(path)
    3. Dim header As MetafileHeader = img.GetMetafileHeader()
    4. Dim width = Math.Floor(img.Width * (96.0F / header.DpiX))
    5. Dim height = Math.Floor(img.Height * (96.0F / header.DpiY))
    6. Dim txt = width.ToString & " x " & height.ToString
    7. MessageBox.Show(txt)
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Vielen Dank Euch beiden für Euer beider Input!

    Das ist ja sagenhaft!

    Jetzt fehlt mir eigentlich nur noch - wenn ich das richtig durchschaue und soweit ich mich mit Bilddateien auskenne - der Wert für die Auflösung, da ja diese nicht immer 96dpi sein muss, sondern oft auch 72 oder gar 300dpi sein kann.

    Wie - wenn ich nichts falsch mache - komme ich dann also (dynamisch) an die Auflösung, bzw, den Faktor "96" ran?
    Es ist eine Vektorgrafik, eine Pixelanzahl gibt es da ja nicht wirklich. Das ist Sache des Ausgabegerätes bzw. der Software was schönes zu machen. Entsprechend gibt es AFAIK auch keine Pixeldichte/Auflösung die "richtig" wäre.
    Je nach Zweck des Unternehmens würde ich
    a) 96 fest hinterlegen (eher schlecht),
    b) den Anwender entscheiden lassen,
    c) für die Anzeige AutoScaleMode.Dpi verwenden oder
    d) den Wert für die Schriftgröße von Windows abgreifen (Control Panel\All Control Panel Items\Display - Set custom text size (DPI))
    @ 3Daycliff: Vielen Dank für diese prima Info.

    Habe nun Wikipedia-Artikel zu Vektorgrafiken und WMF-Grafiken gelesen, bin aber nicht viel schlauer als vorher. Vor allem irritiert hat mich dann der Abschnitt zu den Unzulänglichkeiten, wo insbesondere ein Verwendung in der Regel von 72 dpi angegeben wird. Wie passt das nun wieder zu der Zahl von diesen 96, bzw. dem Faktor von 0,096, den wir hier für die Masse dieser WMF-Datei(en) {ich habe hier ein paar Hunderte davon} zugrund legen?

    Zusatzfrage:
    Wie greift man in VB.Net die "Auflösung", bzw. den Wert für DPI sauber und richtig ab. Habe da leider nichts "Brauchbares" finden können.

    Nachtrag:
    Wenn ich es mit

    VB.NET-Quellcode

    1. Dim dblImgResolution As Double = AutoScaleMode.Dpi

    versuche, kommt da ein Wert von "2,0" daher. Was will uns das nun wieder sagen? (Ich hatte eigentlich 96 erwartet, hab's aber wohl nicht richtig begriffen). Das "2" wohl für den zweiten Parameter der AutoScaleMode-Option steht, nehme ich mal an.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „tamaleus“ ()

    3daycliff schrieb:

    Auf- statt Abrunden
    Sieh Dir das Bild und seine Maße in einem professionellen Bildverarbeitungsprogramm an.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich habe hier nur ein Deppen-(Raster-)Bildverarbeitungsprogramm, dass in der Tat abrunden zu scheint. mspaint (vom selben Unternehmen wie das Dateiformat selbst) rundet auf.
    Da sich aber durchaus eine Höhe oder Breite von z.B. 0.9 Pixel bei der Berechnung ergeben kann, sollte man den speziellen Fall nicht außen vorlassen. Ob nun durch Aufrunden, "Abrunden + wenn 0 mach eine 1 raus" oder "werfe Exception" sei dem TE überlassen.

    @tamaleus
    AutoScaleMode ist ein Enum und kann als Eigenschaft z.B. der Form die eine PictureBox enthält zugewiesen werden. Ob und wie sich das auswirkt, musst du selber mal probieren.
    Was das auslesen angeht, schau z.B. mal hier stackoverflow.com/questions/59…-windows-display-settings
    Mein Deppen-Bildverarbeitungsprogramm fragt übrigens beim Öffnen der Datei, mit welcher Auflösung man das Bild öffnen möchte und schlägt bei mir 90 DPI vor. Von daher solltest du den Weg vielleicht auch gehen.

    3daycliff schrieb:

    sollte man den speziellen Fall nicht außen vorlassen
    Ich denke, das interessiert niemanden, das kann man tun, wie man es möchte, zumal es eh nur beim Drucken und so relevant ist.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Das mit dem Runden ist mir soweit klar und wäre für mich somit erledigt.

    Was ich aber noch nicht verstanden habe ist die Aussage:

    AutoScaleMode ist ein Enum und kann als Eigenschaft z.B. der Form die eine PictureBox enthält zugewiesen werden.


    Kann man mir das bitte mit einem Beispiel erklären. Bzw. mit einer Mustervorlage demonstrieren, wie das dann im Code aussehen würde, um diese Eingeschaft abzufragen. Ich habe das leider nicht hinbekommen.

    PS: Sorry für die zeitlich etwas grösseren Abstände bei meinen Antworten. Sie sind gesundheitlich bedingt.
    Vielen Dank Mokki.

    Aber offensichtlich habe ich ein riesen Brett vorm Kopf: Ich verstehe es einfach nicht.

    Ich habe mir jetzt - wie geraten - die Seite zum Thema SizeMode u.ä. angesehen, verstehe aber halt nicht, wie ich nun damit bzw. mit

    VB.NET-Quellcode

    1. 'Set the SizeMode to center the image.
    2. Me.PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage


    an den nach wie vor gesuchten Wert von diesen - in unserem Fall/Beispiel - "96" komme (siehe hierzu Eintrag Nr. 9 von RodFromGermany, wo er diesen Wert hart-coded und man mir nachher geraten hat, ich solle doch die Auflösung z.B. über die Schriftgrösse des Systems abfragen, da ich über diesen Weg dann an den eigentlich gesuchten Wert , aber als Variable komme und letztlich die Bildmasse korrekt ermitteln zu könne.

    Wo mache ich was falsch? (Und sorry, dass ich anscheinend so begriffsstutzig bin)

    (PS: Ich weiss, dass das verpönt ist und ich versichere, ich bin kein C&P'ler, aber am liebstens wäre mir doch die Zeile, wie ich denn an diese exemplarischen 96 komme.)

    tamaleus schrieb:

    "96"
    Frag mal Frau Google nach 96 dpi, da bekommst Du ein paar Anhaltspunkte, wo das herkommt und was es sonst noch gibt.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!