MapTool

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach unten

MapTool

Beitrag  Till am Fr 11 Feb 2011 - 15:01

Wenn jemand (wahrscheinlich Waschi Cool ) Zeit und Lust hat kann er/sie ein Tool hierfür programmieren:

http://csmhd.nightforum.net/t81-vorlagen#724
Will da dann auch die Smooth-Funktion vom alten Map-Editor übernehmen.

Das Ergebnis sollte dann so oder so ähnlich aussehen. (Reicht auch 1-2 Pixel hinzuzufürgen.)
http://www.csmhd.de/forum/bilder/mapeditor/tool_fuer_maps.png


Zuletzt von Till am Sa 12 Feb 2011 - 4:31 bearbeitet; insgesamt 1-mal bearbeitet (Grund : Überschrift aktualisiert)
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  waschi am Fr 11 Feb 2011 - 16:34

Ich glaube ich hab noch nicht ganz verstanden, was das Tool genau machen soll...
avatar
waschi

Anzahl der Beiträge : 54
Ort : Hauptstadt
Laune : Heiter bis wolkig

Nach oben Nach unten

Re: MapTool

Beitrag  Till am Fr 11 Feb 2011 - 16:57

Die Pixel vom Rand der Map (also die äußersten Linien im Raster) sollen automatisch jeweils in alle 4 Himmelsrichtungen kopiert werden.
Ich rendere nur den Teil der Map, der im Raster liegt. Dadurch hat jedes Feld eine feste größe von 30x30 Pixeln.

Diese Funktion brauche ich da ansonsten rendertechnisch winzige Artefakte vom nächsten Pixel übernommen werden.
Wenn nun aber der nächste Pixel die gleiche Farbe hat wie der Randpixel der Textur, fällt dies nicht mehr auf.
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  waschi am Sa 12 Feb 2011 - 0:02

Wenn du mir erklärst wie das Format der Maps ist bau ich dir gerne einen richtig guten Mapeditor mit WPF. Ich muss auch ehrlich sagen ich hab noch nie den alten Mapeditor gesehen? Also vom klassischen CS...

Ansonsten hier eine Funktion die um ein Bild einen Rand ergänzt. Funktioniert so: Bild wird skaliert, z.B. für einen Rand von 4 wird es 4 mal skaliert. Der äußere Rand der skalierten Bilder wird dann jeweils in das neue Bild kopiert.

Genutzt wird für alles der schöne alte Namespace System.Drawing, der auch als DLL benötigt wird.

Code:

    public Image StretchImageWithBorder(string fullFilePath, int randDicke)
    {
        try
        {
            Image img = Image.FromFile(fullFilePath);
            if (img.Width != img.Height)
                throw new ArgumentOutOfRangeException("Es muss sich um ein quadratisches Bild handeln!");
            else
            {

                Bitmap bm = new Bitmap(img.Height + randDicke * 2, img.Width + randDicke * 2);
                for (int dicke = 0; dicke < randDicke; dicke++)
                {
                    Bitmap reImg = (Bitmap)ResizeImage(img, img.Height + (randDicke * 2 - dicke * 2), img.Width + (randDicke * 2 - dicke * 2), false);

                    for (int i = 0; i < reImg.Width; i++)
                    {
                        bm.SetPixel(dicke, i + dicke, reImg.GetPixel(0, i));
                        bm.SetPixel(bm.Width - dicke - 1, i + dicke, reImg.GetPixel(reImg.Width - 1, i));

                        bm.SetPixel(i + dicke, dicke, reImg.GetPixel(i, 0));
                        bm.SetPixel(i + dicke, bm.Width - dicke - 1, reImg.GetPixel(i, reImg.Width - 1));
                    }
                }

                for (int x = 0; x < img.Width; x++)
                {
                    for (int y = 0; y < img.Height; y++)
                    {
                        bm.SetPixel(x + 4, y + 4, ((Bitmap)img).GetPixel(x, y));
                    }
                }

                return bm;
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        throw new NotImplementedException("Dieser Code-Pfad sollte nicht durchlaufen werden");
    }

    public Image ResizeImage(Image FullsizeImage, int NewWidth, int MaxHeight, bool OnlyResizeIfWider)
    {
        // Prevent using images internal thumbnail
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
        FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

        if (OnlyResizeIfWider)
        {
            if (FullsizeImage.Width <= NewWidth)
            {
                NewWidth = FullsizeImage.Width;
            }
        }

        int NewHeight = FullsizeImage.Height * NewWidth / FullsizeImage.Width;
        if (NewHeight > MaxHeight)
        {
            // Resize with height instead
            NewWidth = FullsizeImage.Width * MaxHeight / FullsizeImage.Height;
            NewHeight = MaxHeight;
        }

        System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero);

        // Save resized picture
        return NewImage;
    }
avatar
waschi

Anzahl der Beiträge : 54
Ort : Hauptstadt
Laune : Heiter bis wolkig

Nach oben Nach unten

Re: MapTool

Beitrag  Till am Sa 12 Feb 2011 - 4:30

Den Mapeditor hab ich schon fertig. Trotzdem danke.
Der ist ja im Spiel integriert. Damit man auch gleich mit Creeps testen kann.

Die Funktion ist super, die du geschrieben hast !!
Kleine Korrektur:
Code:

for (int x = 0; x < img.Width; x++)
{
  for (int y = 0; y < img.Height; y++)
  {
    bm.SetPixel(x + randDicke, y + randDicke, ((Bitmap)img).GetPixel(x, y)); // randDicke anstatt 4
  }
}

Sieht auch super aus. Ist nur leider nicht das was ich wollte. Will eine Kopie des jeweiligen Randepixels nach Oben/Rechts/Unten/Links. Und die Ecken mit der Eckfarbe ausgefüllt.
Ansonsten geht das mit dem Rendern nicht 100%ig.

Als Eingabebild die Map im Format 512x512, nur am Raster ausgerichtet.
Schön wäre, wenn die Funktion die Größe abfragt. Wenn sie 481x481 Pixel ist wird ein neues Bild erstellt mit der Größe 512x512 und das Original da hereinkopiert an Position 15/15.

Hoffe du weißt nun wie ichs haben möchte. Im Vergleich zu deiner Funktion ist das sehr simpel.
Aber kannst ja noch die Smoothfunktion mit reinschreiben. (für 90°- & Linien Maps)

Ah hab gerade meinen alten Editor gefunden. Ordnung is alles Wink
Aber vorsicht hab den innerhalb von 3 Tagen geschrieben und so schauter auch aus.
http://www.csmhd.de/forum/dateien/cs_mapeditor_src.zip
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  waschi am So 13 Feb 2011 - 12:57

Sorry für die Wartezeit, bin dieses WE bei meinen Eltern zu Besuch Wink Ich denke ich hab es noch nicht ganz verstanden *g* Hier erstmal die Funktion die ein beliebiges Bild nimmt und den Rand ergänzt so wie du es willst:

Code:

    public Image ExpandImageBorder(Image img, int randDicke)
    {
        Bitmap imgBm = (Bitmap) img;
        Bitmap bm = new Bitmap(img.Width + 2 * randDicke, img.Height + 2 * randDicke);
        for (int x = 0; x < img.Width; x++)
        {
            for (int y = 0; y < img.Height; y++)
            {
                bm.SetPixel(x + randDicke, y + randDicke, ((Bitmap)img).GetPixel(x, y));
            }
        }

        //Jede Zeile
        for (int z = 0; z < imgBm.Height; z++)
        {
            var ersterPixel = imgBm.GetPixel(0, z);
            var letzterPixel = imgBm.GetPixel(img.Width - 1, z);

            for (int i = 0; i < randDicke; i++)
            {
                bm.SetPixel(i, z + randDicke, ersterPixel);
                bm.SetPixel(bm.Width - 1 - i, z + randDicke, letzterPixel);
            }
        }

        //Jede Spalte
        for (int s = 0; s < imgBm.Width; s++)
        {
            var ersterPixel = imgBm.GetPixel(s, 0);
            var letzterPixel = imgBm.GetPixel(s, img.Height - 1);

            for (int i = 0; i < randDicke; i++)
            {
                bm.SetPixel(s + randDicke, i, ersterPixel);
                bm.SetPixel(s + randDicke, bm.Width - 1 - i, letzterPixel);
            }
        }

        //Die Ecken ;)
        var colorLinksOben = imgBm.GetPixel(0, 0);
        var colorRechtsOben = imgBm.GetPixel(imgBm.Width - 1, 0);
        var colorLinksUnten = imgBm.GetPixel(0,  imgBm.Height - 1);
        var colorRechtsUnten = imgBm.GetPixel(imgBm.Width - 1, imgBm.Height - 1);
        for (int i = 0; i < randDicke; i++)
        {
            for (int j = 0; j < randDicke; j++)
            {
                bm.SetPixel(i, j, colorLinksOben);
                bm.SetPixel(i + imgBm.Width + randDicke, j, colorRechtsOben);
                bm.SetPixel(i, j + imgBm.Height + randDicke, colorLinksUnten);
                bm.SetPixel(i + imgBm.Width + randDicke, j + imgBm.Height + randDicke, colorRechtsUnten);
            }
        }

        return bm;
    }

Was ich genau nicht verstehe: Das Eingabebild kann 481 oder 512 Pixel groß sein? Ich dachte das Ausgabebild soll 512px groß sein und das eigentliche Bild ist immer 481px groß und sollte darauf skaliert werden...

Soll ich einfach eine Smooth-Funktion schreiben die einfach jedes Bild durch eine Smooth-Filter jagt?
avatar
waschi

Anzahl der Beiträge : 54
Ort : Hauptstadt
Laune : Heiter bis wolkig

Nach oben Nach unten

Re: MapTool

Beitrag  Till am So 13 Feb 2011 - 13:55

schaue ich mir bei gelegenheit näher an. müsste aber gut funktionieren. Der Rand ist nur nicht ganz gleichmäßig.
Oben-links 15x15 unten-rechts 16x16. Lässt sich ja noch fix mit einbauen.

Die Smooth-Sides funktions soll in etwa Folgendes machen:
Aus: Normal
Wird: Gesmoothed Wink

Achso bei so kleinem Quellcode ist das egal, aber generell sind mir programme auf Deutsch lieber. Danke dir.
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  waschi am So 13 Feb 2011 - 14:06

Till schrieb:Achso bei so kleinem Quellcode ist das egal, aber generell sind mir programme auf Deutsch lieber. Danke dir.

Wie meinst du das mit Deutsch? Ich hab das mit einem 10px Rand und quadratischen Bildern getestet, damit funktioniert es genau wie erwartet.

EDIT: Ach du meinst wenn man ein 481px Bild hat soll es ja 512x512 werden und damit hat es rechts/unter einen größeren Rand ^^

Hier dann eine Funktion die nur mit Bilder die 481x481 groß sind funktioniert:

Code:

    public Image ExpandImageBorder(string fullFilePath)
    {
        Image img = Image.FromFile(fullFilePath);
        return ExpandImageBorder(img);
    }

    public Image ExpandImageBorder(Image img)
    {
        if (img.Width != img.Height)
            throw new ArgumentOutOfRangeException("Das Bild ist nicht quadratisch...");
        if (img.Width != 481)
        {
            // Entweder das Bild neu skalieren oder Exception werfen?
            throw new ArgumentOutOfRangeException("Das Bild darf nur 481x481px groß sein!");
        }
        return _expandImageBorder2(img);
    }

    /// <summary>
    /// Funktioniert nur mit Bildern die 481x481 Pixel groß sind.
    /// </summary>
    public Image _expandImageBorder2(Image img)
    {
        int randDicke = 15;

        Bitmap imgBm = (Bitmap)img;
        Bitmap bm = new Bitmap(512,512);
        for (int x = 0; x < img.Width; x++)
        {
            for (int y = 0; y < img.Height; y++)
            {
                bm.SetPixel(x + randDicke, y + randDicke, ((Bitmap)img).GetPixel(x, y));
            }
        }

        randDicke = 16;
        //Jede Zeile
        for (int z = 0; z < imgBm.Height; z++)
        {
            var ersterPixel = imgBm.GetPixel(0, z);
            var letzterPixel = imgBm.GetPixel(img.Width - 1, z);

            for (int i = 0; i < randDicke; i++)
            {
                bm.SetPixel(i, z + randDicke - 1, ersterPixel);
                bm.SetPixel(bm.Width - 1 - i, z + randDicke - 1, letzterPixel);
            }
        }

        //Jede Spalte
        for (int s = 0; s < imgBm.Width; s++)
        {
            var ersterPixel = imgBm.GetPixel(s, 0);
            var letzterPixel = imgBm.GetPixel(s, img.Height - 1);

            for (int i = 0; i < randDicke; i++)
            {
                bm.SetPixel(s + randDicke - 1, i, ersterPixel);
                bm.SetPixel(s + randDicke - 1, bm.Width - 1 - i, letzterPixel);
            }
        }

        //Die Ecken ;)
        var colorLinksOben = imgBm.GetPixel(0, 0);
        var colorRechtsOben = imgBm.GetPixel(imgBm.Width - 1, 0);
        var colorLinksUnten = imgBm.GetPixel(0, imgBm.Height - 1);
        var colorRechtsUnten = imgBm.GetPixel(imgBm.Width - 1, imgBm.Height - 1);

        for (int i = 0; i < 15; i++)
        {
            for (int j = 0; j < 15; j++)
            {
                bm.SetPixel(i, j, colorLinksOben);
            }
        }
        for (int i = 0; i < 16; i++)
        {
            for (int j = 0; j < 15; j++)
            {
                bm.SetPixel(i + imgBm.Width + 15, j, colorRechtsOben);
            }
        }
        for (int i = 0; i < 15; i++)
        {
            for (int j = 0; j < 16; j++)
            {
                bm.SetPixel(i, j + imgBm.Height + 15, colorLinksUnten);
            }
        }
        for (int i = 0; i < 16; i++)
        {
            for (int j = 0; j < 16; j++)
            {
                bm.SetPixel(i + imgBm.Width + 15, j + imgBm.Height + 15, colorRechtsUnten);
            }
        }
        return bm;
    }
avatar
waschi

Anzahl der Beiträge : 54
Ort : Hauptstadt
Laune : Heiter bis wolkig

Nach oben Nach unten

Re: MapTool

Beitrag  Till am So 13 Feb 2011 - 18:48

Danke, hier ist das fertige Projekt: MapTool.zip

Die Smoothfunktion kannste noch reinbauen, wenn du lust hast. Kann man bestimmt viel vom alten Editor übernehmen.
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  waschi am Mo 14 Feb 2011 - 21:02

Ich hab einfach deine Smooth-Funktion vom alten Editor fast 1:1 kopiert, da weiß ich wenigstens es ist genau das, was du willst Wink

EDIT: Achja, wieso eigentlich kein VS2010? Ich krieg immer Ausschlag wenn ich das alte VS nehmen muss... Und sorry, dass da noch der Resharper-Ordner drinne ist, hab vergessen den zu löschen ^^
Anhänge
MapTool_wSmooth.zip Du hast hier nicht die Berechtigung, Dateien runterzuladen.(513 KB) Anzahl der Downloads 9
avatar
waschi

Anzahl der Beiträge : 54
Ort : Hauptstadt
Laune : Heiter bis wolkig

Nach oben Nach unten

danke waschi

Beitrag  Till am Mo 14 Feb 2011 - 21:27

Managed DX wird von der 2010er (leider) nicht mehr unterstützt. Geht nur mit 2008.
Für 'nur Windows' Programme & Aspx verwende ich auch die neue Version.
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  waschi am Mo 14 Feb 2011 - 21:32

Till schrieb:Managed DX wird von der 2010er (leider) nicht mehr unterstützt. Geht nur mit 2008.
Für 'nur Windows' Programme & Aspx verwende ich auch die neue Version.

Was heißt denn hier unterstützt, du kannst doch auch mit VS2010 ein .Net 2.0 Programm schreiben und deine MDX-Bibliotheken einbinden, das hat doch nix mit VS zu tun.
avatar
waschi

Anzahl der Beiträge : 54
Ort : Hauptstadt
Laune : Heiter bis wolkig

Nach oben Nach unten

Re: MapTool

Beitrag  Till am Di 29 Nov 2011 - 14:41

2010er funktioniert nun mit Managed DX. Kp warum das nicht vorher ging.

Ich habe das MapTool nun direkt in das Programm mit eingebaut.
Auf diese Weise bekommt der User nicht mit was intern passiert, es entstehen keine Fehler und die Bilder sind sogar etwas kleiner.
avatar
Till
Admin

Anzahl der Beiträge : 254
Ort : In der ''Hello World''
Laune : vorfreudig ;)

Nach oben Nach unten

Re: MapTool

Beitrag  Gesponserte Inhalte


Gesponserte Inhalte


Nach oben Nach unten

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach oben


 
Befugnisse in diesem Forum
Sie können in diesem Forum nicht antworten