tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
1424
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Avatar von Sebastian Schmidt
    Sebastian Schmidt Sebastian Schmidt ist offline Mitglied Silber
    Registriert seit
    Dec 2002
    Ort
    Hannover
    Beiträge
    75
    Da ich noch nie mitgemacht habe und son Abgabethread ebend von Alex bekommen habe, wer ich mich ein wenig daran orientieren.

    Also das Projekt wurde bei mir in .NET realisiert mit der Sprache VB.
    Realisiert ist es direkt OOP mit den Klassen dazu, aber der Code sollte allgemeinverständlich sein.

    Angehängt sind einmal, das ganze Projekt und einmal nur die Binary mit den Würfeln.

    Dann kommen wir mal zur Sache ....


    Ausgabe / Beispiel:



    Inhalt des Projektes:
    Formklasse
    Cubingklasse
    Ditheringklasse

    -------------------------------------------------------------------------------------------------------------------

    Mainform mit 3 Pictureboxen, einem Menü mit 2 Buttons und dem Codebehind der nun folgt:
    Code vbnet:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    Public Class Form1
        ''' <summary>
        ''' Originallbild im Speicher
        ''' </summary>
        ''' <remarks></remarks>
        Dim myBitmap As Bitmap
        ''' <summary>
        ''' Save after Open!
        ''' </summary>
        ''' <remarks></remarks>
        Dim loaded As Boolean = False
     
        ''' <summary>
        ''' Call diverser Klassen zur Modifierzung der Bilder
        ''' </summary>
        ''' <remarks></remarks>
        Sub SyncPicBoxes()
            PictureBox1.Image = myBitmap
            Dim Dither As New Dithering(myBitmap)
            PictureBox2.Image = Dither.Bitmap
            Dim bmp As Bitmap
            Dim gfx As Graphics
            bmp = New Bitmap(PictureBox1.Image.Width, PictureBox1.Image.Height)
            gfx = Graphics.FromImage(bmp)
            Dim Cube As New Cubing(Dither.Bitmap, gfx)
            PictureBox3.Image = bmp
        End Sub
     
        ''' <summary>
        ''' Open File Button, call der Syncmethode
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
            OPF1.Multiselect = False
            OPF1.Filter = "Bitmap *.bmp|*.bmp"
            If OPF1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                myBitmap = Bitmap.FromFile(OPF1.FileName)
                ToolStripTextBox1.Text = OPF1.FileName
                SyncPicBoxes()
                loaded = True
            End If
        End Sub
     
        ''' <summary>
        ''' Save File Button
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click
            If loaded Then
                SFD1.Filter = "Bitmap *.bmp|*.bmp"
                If SFD1.ShowDialog() = Windows.Forms.DialogResult.OK Then
                    PictureBox3.Image.Save(SFD1.FileName)
                End If
            Else
                MsgBox("Dude, save comes after open >_<!")
            End If
        End Sub
    End Class

    Ditheringklasse:
    Code vbnet:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    
    Public Class Dithering
        Private mDitheringArray As Integer(,)
        Private mBitmap As Bitmap
     
        Public Sub New(ByVal aBitmap As Bitmap)
            mBitmap = Dithering(aBitmap)
        End Sub
     
        Public ReadOnly Property Bitmap() As Bitmap
            Get
                Return mBitmap
            End Get
        End Property
     
        Private Function Dithering(ByVal Orginalbild As Bitmap) As Bitmap
            Dim Höhe As Integer = Orginalbild.Height
            Dim Breite As Integer = Orginalbild.Width
            mDitheringArray = New Integer(Höhe - 1, Breite - 1) {}
            Dim Spalte As Integer = 0, Zeile As Integer = 0, temp As Integer = 0
            Dim neu As New Bitmap(Breite, Höhe)
            Dim rot As Integer = 0, grün As Integer = 0, blau As Integer = 0, grau As Integer = 0
     
            For Spalte = 0 To Breite - 1
                For Zeile = 0 To Höhe - 1
                    Dim pixel As Color = Orginalbild.GetPixel(Spalte, Zeile)
                    rot = pixel.R
                    grün = pixel.G
                    blau = pixel.B
                    grau = GrauBerechnen(rot, grün, blau)
                    mDitheringArray(Zeile, Spalte) = grau
                Next
            Next
     
            For Zeile = 1 To Höhe - 2
                For Spalte = 1 To Breite - 2
                    DitheringBerechnen(Zeile, Spalte)
                Next
            Next
     
            For Spalte = 0 To Breite - 1
                For Zeile = 0 To Höhe - 1
                    Dim pixel As Color = Orginalbild.GetPixel(Spalte, Zeile)
                    temp = mDitheringArray(Zeile, Spalte)
                    If temp = 0 Then
                        temp = 0
                    Else
                        temp = 255
                    End If
                    pixel = Color.FromArgb(temp, temp, temp)
                    neu.SetPixel(Spalte, Zeile, pixel)
                Next
            Next
            Return neu
        End Function
     
        Private Function GrauBerechnen(ByVal rot As Integer, ByVal gruen As Integer, ByVal blau As Integer) As Integer
            Return (rot + gruen + blau) \ 3
        End Function
     
        Private Sub DitheringBerechnen(ByVal Zeile As Integer, ByVal Spalte As Integer)
            Dim Teiler As Integer = 0
            If mDitheringArray(Zeile, Spalte) < 128 Then
                Teiler = mDitheringArray(Zeile, Spalte) / 16
                mDitheringArray(Zeile, Spalte) = 0
            Else
                Teiler = (mDitheringArray(Zeile, Spalte) - 255) \ 16
                mDitheringArray(Zeile, Spalte) = 1
            End If
            mDitheringArray(Zeile + 1, Spalte - 1) += (Teiler * 3)
            mDitheringArray(Zeile + 1, Spalte) += (Teiler * 5)
            mDitheringArray(Zeile + 1, Spalte + 1) += Teiler
            mDitheringArray(Zeile, Spalte + 1) += (Teiler * 7)
        End Sub
    End Class

    Cubingklasse:
    Code vbnet:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    
    Public Class Cubing
        Private mBitmap As Bitmap
        Private mCubes(5) As Bitmap
        Private mPxHeight As Integer = 12
        Private mPxWidth As Integer = 12
        Private mRunsHeight As Integer = 0
        Private mRunsWidth As Integer = 0
        Private mCubeArray(,) As Integer
        Private mCubeBitmap As Bitmap
        Private mCubeGrafic As Graphics
     
        Public Sub New(ByVal aBitmap As Bitmap, ByRef aGfx As Graphics)
            mBitmap = aBitmap
            mCubeGrafic = aGfx
            mRunsHeight = System.Math.Floor(mBitmap.Height / mPxHeight)
            mRunsWidth = System.Math.Floor(mBitmap.Width / mPxWidth)
            BuildCubes()
            Cubes()
        End Sub
     
     
        Public ReadOnly Property CubeBitmap() As Bitmap
            Get
                Return mCubeBitmap
            End Get
        End Property
     
     
        Private Sub BuildCubes()
            For i As Integer = 0 To 5
                Dim tmp As Bitmap = Image.FromFile("Cubes\" + (i + 1).ToString + ".png")
                tmp.Tag = "Cubes\" + (i + 1).ToString + ".png"
                mCubes(i) = tmp
            Next
        End Sub
     
        Private Sub Cubes()
            ReDim mCubeArray(mRunsHeight - 1, mRunsWidth - 1)
            For i As Integer = 0 To mRunsHeight - 1
                For j As Integer = 0 To mRunsWidth - 1
                    mCubeArray(i, j) = CheckCube(i * 12, j * 12).ToString
                Next
            Next
            For i As Integer = 0 To mRunsHeight - 1
                For j As Integer = 0 To mRunsWidth - 1
                    mCubeGrafic.DrawImage(mCubes(mCubeArray(i, j) - 1), j * 12, i * 12)
                Next
            Next
        End Sub
     
        Private Function CheckCube(ByVal aY As Integer, ByVal aX As Integer) As Integer
            Dim counter As Integer = 0
            For i As Integer = 0 To mPxHeight - 1
                For j As Integer = 0 To mPxWidth - 1
                    Dim pixel As Color = mBitmap.GetPixel(aX + i, aY + j)
                    If ColorBlack(pixel) Then counter += 1
                Next
            Next
            Return CalcCube(counter)
        End Function
     
        Private Function ColorBlack(ByVal aColor As Color) As Boolean
            If aColor.R = 0 And aColor.G = 0 And aColor.B = 0 Then
                Return True
            Else
                Return False
            End If
        End Function
     
        Private Function CalcCube(ByVal aCount As Integer) As Integer
            If aCount = 0 Then Return 1
            Return System.Math.Ceiling(aCount / 24)
        End Function
    End Class

    Wie schon im Aufgabenthread geschrieben ist das mein so ziemlich erster versuch mit Bildern usw. also für Verbesserungen bin ich gern offen, auch für Codeverbesserungen. Man lernt ja schliesslich niemals aus.

    Anhänge:
    siehe unten


    Edit: Ach ganz wichtig! Der Link zum Denny und Allen Bild!
    http://img683.imageshack.us/img683/6...allenshore.png bitte wieder als Jpeg speichern dann

    Edit2: klappt nur mit 400x350 großen BMPs, die Grafik von Alex mit über 4k Pixel hat gezeigt das ich das mit der Picturebox noch zoomen oder resizen müsste, next time

    Edit3: Klappt nun doch mit allen größen, danke an Alex für die Hilfe und es wurde von Files her von BMP auf Jpeg umgestellt.
    Auch hier nochmal das Bild von Alex als Testbild.
    http://fc09.deviantart.net/fs25/f/20...icidegirls.jpg
    und hier die Ausgabe ( die allerdings 40 Sekunden zu berechnen dauert xD ):
    http://img641.imageshack.us/i/girlcube.png/
    Angehängte Dateien Angehängte Dateien
    Geändert von Sebastian Schmidt (27.03.10 um 23:27 Uhr)
     

Thema nicht erledigt

Ähnliche Themen

  1. Quiz?
    Von MeisterLampion im Forum Office-Anwendungen
    Antworten: 12
    Letzter Beitrag: 03.11.06, 15:48
  2. Quiz: Was bin ich?
    Von MrTwister im Forum Werkstatt
    Antworten: 3
    Letzter Beitrag: 05.04.06, 19:14
  3. Quiz
    Von JannyR im Forum PHP
    Antworten: 2
    Letzter Beitrag: 21.05.05, 15:58
  4. Quiz
    Von alkaline im Forum PHP
    Antworten: 0
    Letzter Beitrag: 27.09.04, 10:16
  5. php Quiz
    Von Sim im Forum PHP
    Antworten: 0
    Letzter Beitrag: 09.05.04, 12:43