ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
1424
1424
EMPFEHLEN
-
27.03.10 17:04 #1
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/Geändert von Sebastian Schmidt (27.03.10 um 23:27 Uhr)
Ähnliche Themen
-
Quiz?
Von MeisterLampion im Forum Office-AnwendungenAntworten: 12Letzter Beitrag: 03.11.06, 15:48 -
Quiz: Was bin ich?
Von MrTwister im Forum WerkstattAntworten: 3Letzter Beitrag: 05.04.06, 19:14 -
Quiz
Von JannyR im Forum PHPAntworten: 2Letzter Beitrag: 21.05.05, 15:58 -
Quiz
Von alkaline im Forum PHPAntworten: 0Letzter Beitrag: 27.09.04, 10:16 -
php Quiz
Von Sim im Forum PHPAntworten: 0Letzter Beitrag: 09.05.04, 12:43





Login





