Ja sehr cool! Wir haben keinen Zeitdruck, also nur nicht hetzen lassen. Ich hab mal die DLL angehängt. Einfach referenzieren.
Das ist mein Code in der Console-Application:
using System.Drawing;
using ImageTiler.Domain;
using ImageTiler.Domain.Model;
using Size = ImageTiler.Domain.Model.Size;
namespace ImageTiler.Console
{
internal class Program
{
private static void Main(string[] args)
{
var config = new Configuration
{
TilesLocation = @"d:\Stuff\Train Fever\Raw Roman Chwalek\Textures\bricks\",
OutputFilename = @"d:\Stuff\Train Fever\Raw Roman Chwalek\Textures\test\customBrickwall.png",
TileMatrixSize = new Size(100, 70),
TileSize = new Size(100, 27),
GapSize = 3,
BackgroundColor = Color.FromArgb(0, 0, 0, 0),
StaggeredRatio = 0.5,
TextureWidth = 2048
};
var logger = new ConsoleLogger();
var tileFactory = new RandomTileFactory(config.TileSize, config.TilesLocation);
var processor = new TilingProcessor(config, tileFactory, logger);
processor.Tile();
}
}
}
Alles anzeigen
Die Config benötigt folgende Werte:
Property
| Description
| Note
|
| TilesLocation | Ordner in dem all die Ziegelsteine liegen | |
| OutputFilename | Ordner und Dateiname für die zu generierende Textur | immer PNG |
| TileMatrixSize | Anzahl der Ziegelsteine in x- und y-Richtung | "width" sind die Spalten, "height" sind die Zeilen |
| TileSize | Einheitliche Größe jeder Ziegelstein-Grafik; alle Ziegelsteine werden auf diese Einheitsgröße skaliert | width/height in Pixel |
| GapSize | Dicke der Fugen | in Pixel |
| BackgroundColor | Farbe der Fugen | System.Drawing.Color |
| StaggeredRatio | Versatz der Zeilen in Prozent | 0.5 (=50%) entspricht einem Versatz von einer halben Ziegelsteinlänge |
TextureWidth
| Breite auf welche die zu generierende Textur skaliert wird
| Dieses Feature ist im Augenblick deaktiviert
|
ITileFactory
Die 'RandomTileFactory' implementiert IFileFactory und macht nichts weiter als zufällig einen Ziegelstein aus dem Ordner (in 'TilesLocation') zu fischen und auf die Einheitsgröße zu skalieren.
ILogger
Den ILogger müßtest Du selbst implementieren.
namespace ImageTiler.Domain
{
public interface ILogger
{
void Log(string message);
}
}
Ich hab auf die Console ausgegeben und mir daher einen ConsoleLogger geschrieben. Das geht ja bei Dir nicht. Also entweder Du implementierst einen eigenen ILogger oder zu verzichtest auf Logging und instanziierst einfach den 'DefaultLogger'.
EDIT: Du kannst eigentlich komplett auf den Logger verzichten. Ich hab ihn nur geschrieben, um die Zeilennummern auszugeben, damit ich auf der Konsole den Fortschritt sehen kann. Sonst logge ich nichts - ergibt also keinen Sinn, das in ein Logfile zu schreiben.
TilingProcessor
Der TilingProcessor macht die eigentliche Arbeit. Er benötigt die Config, die TileFactory und den Logger.
GUI
Es sollte nicht viel Arbeit sein. Die denkbar einfachste GUI wäre einfach ein simples Form, in dem man alle Config-Werte eingibt, einen Knopf drückt und die Textur wird dann erzeugt. Das wars.
Wenn man es etwas luxuriöser haben will, könnte ich mir folgende Features vorstellen:
- Locations könnte man per FileOpen-Dialog (Browse) einstellen, statt nur ein Textfeld.
- Man könnte erlauben, die Werte zu speichern/laden, damit man nicht jedesmal alles neu eingeben muß.
- Man könnte die generierte Textur direkt anzeigen.
Aber Du bist der UI-Mensch, Du solltest freie hand/Entscheidungsfreiheit haben, wie Du es gern umsetzen möchtest.
Probleme
Je nach Größe der Matrix kann das resultierende File extrem groß werden! Für meine Triebwagenhalle hab ich eine Textur erzeugt, die über 20.000 Pixel breit war (360x170 Ziegelsteine). Ich hab erst versucht, das File direkt im Programm runterzuskalieren (daher der Config-Value 'TextureWidth'), aber es gab haufenweise OutOfMemoryExceptions, dahr ist der Code auskommentiert. Ich hab dann die generierte 20.000-Pixel-Datei mit Irfanview runteskaliert auf meine 2048 und das ging auch.
Wenn Du Fragen hast, jederzeit. 