Announcement

Collapse
No announcement yet.

4-bit .bmp pixelweise auslesen & in koorindatenform bringen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 4-bit .bmp pixelweise auslesen & in koorindatenform bringen?

    moien,

    einige von euch hatten ja schon die anderen threads zu meinem oberthema gesehen und netterweise oft und viel geholfen, nochmals danke dafür.
    die die das gesehen hatte ist vielleicht aufgefallen, dass ich mir bei den bildinformationen erst noch behelfen musste, weil die andere gruppe, die das foto erstellen sollen, noch nicht soweit war. nun sind sie es und speichern das bild als 4bit bmp.
    nun muss ich ja die informationen wieder aus dem bild herauskriegen, damit ich endlich meinem behelf mit pic_res(x,y) = 1 für die koordinaten und helligkeit los werde und mal ein "lauffähiges" programm hinkriegen.

    allerdings weiss ich nicht, wie ich das mit dem auslesen der bmphinkriege, da ich mich da NULL auskenne und auch keine ahnung von hex und soweiter habe.

    kann mir da jemandwieder helfen oder hilfreiche tipps geben?

    also ich muss das bild auslesen können, die bildpunkt zu koordinaten zuordnen können, und das 4bit bild, also mit 16 graustufen, in eines mit nur 2 werten für schwarz oder weiss umformen lassen, also eine ntscheidung schreiben, ob die graustufe mehr weiss ist und dann zu weiss formen, oder ob die graustufe mehr schwarz ist und zu schwarz definieren.

    danke für jede hilfe!

    Andreas

  • #2
    Hallo -horn-,

    soweit ich weiß, ist der Zugriff auf die direkten Pixeldaten im .NET (in den Klassen Image oder Bitmap) nicht vorgesehen, und daher nicht möglich.

    Aber es bleibt ja immer noch der direkte Zugriff ;-)

    Hierzu öffnest Du die Bilddatei binär und liest sie komplett aus. Hierfür würde ich mir folgendes Datenmodell bauen:
    - Klasse BMP-Header
    - Klasse BMP-Infoblock
    - Klasse BMP Pixeldata

    Wie diese Klassen dann konkret aussehen, kannst Du z.B. bei Wikipedia genau nachlesen:
    Wikipedia - Windows BMP

    Der Rest ist eigentlich logisch und einfach, das sollte kein Problem darstellen.

    Viele Grüße
    _ntr_

    Comment


    • #3
      moien,

      und genau davon hab ich noch keinen plan, wie deine vorgeschlagenen schritte gehen

      Comment


      • #4
        Hallo -horn-,

        ich werde Dir schon alleine aus zeitgründen hier keine fertige Lösung präsentieren. Aber ich möchte Dir auf die Sprünge helfen:

        Also der Header ist (wie in meinem geposteten Link zu sehen) ist so aufgebaut, dass er aus einem Word und 3 DWord Inhalten besteht, das bedeutet, dass Du nun 4 Klassenvariablen in "BMPHeader" definierst (1x ushort und 3x uint). Benennen kannst Du sie wie in Wikipedia angegeben (z.B. "bfType"). Dann verwendest Du Eigenschaften (Getter/Setter), um darauf zugreifen zu können. Erst einmal fertig mit dem Header.

        BMPInfoblock: analog wie beim Header vorgehen. (5x DWord [Size, Compression etc...], 4x Long, 2x Word). Ebenso mit Eigenschaften versehen.

        Der interessantere Teil ist hier dann die Pixeldatenklasse, hierfür kannst Du z.B. ein Dictionary verwenden, das als Key eine Point-Struktur (System.Drawing) verwendet, und als Value sollte es dann ein recht dynamisches Format haben, z.B. long (damit man es ggf. mit der BitConverter Klasse verwenden kann). Jedes Pixel wird also in ein long transformiert, und bei Bedarf wieder in Bits zurückgewandelt. -> Deshalb sollte die Klasse Pixeldata auch eine Methode fürs Einlesen der Pixeldaten bereitstellen, und auch eine zum wieder ausgeben.
        Bequemlichkeit ist auch ein Thema, darum kann man es sich überlegen auch einen Enumerator einzubauen und/oder einen direkten Zugriff auf die einzelnen Pixeldaten anhand der X- und Y-Position. Das ist einmalig etwas Fleißarbeit, jedoch erwarte ich konkret, dass Du Dich mal daran versuchst, sollten konkrete Probleme auftreten, dann helfe ich gerne weiter.

        Zu guter Letzt wäre eine Bitmap-Klasse nicht schlecht, die sozusagen als Manager dient, und nur die Aufteilung der Aufgaben vornimmt, und diese an entsprechende oben beschriebene Klassen weiterverteilt (Kapselung). Die Manager Klasse könnte dann auch ein FileImport und FileExport bereitstellen.

        Viele Grüße
        _ntr_

        Comment

        Working...
        X