Ok, ich versuche grade ein Programm zu schreiben zum vereinfachten zusammenstellen eines Texturpacks für Minecraft. Da das Spiel lowres Texturen verwendet konnte ich leider einen Fehler in den draw Funktionen des Graphics Objekts finden.
Sub CboxTextureSelectedIndexChanged(ByVal sender As Object, ByVal e As _
EventArgs) Handles cboxTexture.SelectedIndexChanged
'picTexture ist 512x512 Pixel groß und auf No Border gestellt
' damit die Zeichenfläche diese größe hat
picTexture.Image = LoadImage(cboxTexture.SelectedItem.ToString(), _
cboxPack.SelectedIndex)
Dim tex As Image = picTexture.Image
If tex.Width < picTexture.ClientSize.Width And tex.Height < _
picTexture.ClientSize.Height Then
'x und y werden an dieser Stelle auf 256 gesetzt da das
' die original Größe beider Texturen ist
Dim x As Integer = tex.Width, y As Integer = tex.Height, ratio As Double = x _
/ y
'dieser skalierungs Code ist für die nicht 1:1 Texturen mit denen ich zwar
' auch Probleme habe, aber ebenfalls die Vermutung das eh alles auf diesem
' Problem beruht
x = picTexture.ClientSize.Width
y = CInt(Math.Floor(x / ratio))
If y > picTexture.ClientSize.Height Then
y = picTexture.ClientSize.Height
x = CInt(Math.Floor(y * ratio))
End If
'an dieser Stelle wird ein Bitmap mit 512x512 Pixel
' erstellt
Dim pic As New Bitmap(x, y)
Using g As Graphics = Graphics.FromImage(pic)
'Antialiasing ist das letzte was man beim
' vergrößern von Minecraft Texturen braucht
g.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
g.SmoothingMode = Drawing2D.SmoothingMode.None
g.DrawImage(tex, New Rectangle(0, 0, x, y), New Rectangle(0, 0, tex.Width, _
tex.Height), GraphicsUnit.Pixel)
g.DrawImageUnscaled(tex, 0, 0)
End Using
'g.ScaleTransform(picTexture.Width, picTexture.Height)
picTexture.Image = pic
Try
pic.Save("D:\" & cboxTexture.SelectedItem.ToString().Replace("/", "-"), _
Imaging.ImageFormat.Png)
Catch ex As Exception
End Try
'picTexture.Image = tex
End If
picTexture.Refresh()
End Sub dieser Code erzeugt bei 2 exakt gleich großen Texturen (256x256) unterschiedliche Fehler.
Bei der ersten Textur terrain.png wird an einer stelle, aus mir unerklärlichen Gründen trotz benutzung von DrawImageUnscaled eine Zeile und Spalte 2 mal hintereinander gezeichnet, die in das tex Bitmap gezeichnete Version ist dadurch 257x257 Pixel groß.
Bei beiden Texturen spinnt die DrawImage Funktion in der Weise dass, obwohl ich die 2 256x256 Texturen auf exakte 512x512 skaliere, die Texturen links oben um 1 pixel abgeschnitten werden.
Ich hatte schon die vermutung das sie einfach aus dem der PictureBox gerutscht sind und hab daher das Offset etwas nach rechts unten verschoben aber der Abschnitt blieb.
Zur veranschaulichung habe ich mal das Ergebnis des Codes für beide Texturen hochgeladen
Bei der terrain Textur kann man in der mitte sehen das diese 2 Pixel in die im Hintergrund skalierte Version reinragt, die art Textur aber nur um einen Pixel (eigentlich sind es nur 1 bzw kein Pixel die die beiden rein ragen aber es sieht so aus weil die skalierte Version im Hintergrund 1 Pixel nach links oben gerutscht ist). Die doppelte Reihe bei der terrain Textur habe zumindest endecken können, an dem grünen ding links oben das der Kaktus von oben sein soll und an dem Holzstück darüber sieht man das eine Reihe doppelt ist.
Da ich mir unsicher bin ob es an meinem .NET liegt das eh schon einen Fehler beim debuggen hat, (kann keine Tooltips mit einem + mehr aufklappen da sie dauernd verschwinden) hab ich ein Testprojekt erstellt das den selben Code verwendet um beide Texturen auf die selbe Art in gleich große PictureBoxen zu zeichnen.
http://ul.to/oaru66
Sofern jemand so nett wäre und das Testprojekt bei sich startet und mir sagt ob die angezeigten Texturen wie auf den von mir hochgeladenen Versionen aussehen kann ich dann feststellen ob GDI+ einen Fehler hat oder mein .NET einfach beknackt geworden ist.
So oder so brauche ich aber wohl eine alternative zum skalieren und manipulieren von Bildern für mein Programm. Wenn also jemand eine kostenlose kennt schreibt mir bitte wo ich sie kriegen kann und wo ich am besten nachlesen kann wie ich sie benutze. Warscheinlich muss ich DirectX oder OpenGL nehmen, oder einfach mein System Nuken und neu machen.
Ich danke hiermit allen die mir bei meinen Fragen und Problemen helfen bzw geholfen haben. ^^ |