2017-08-12 4 views
0

Ich versuche, einen Level-Editor mit Windows Forms für mein Monogame-Projekt zu erstellen und kleine pixelbasierte Bilder zu einem Bildkasten ohne Qualitätsverlust zu zeichnen, wenn skaliert. In Monogame, wenn ich dies tun muss, kann ich den Zieh-Typ einfach auf PointClamp setzen und dann wird jedes Pixel so gezeichnet, wie es ist, anstatt pixeliert zu werden, wenn gezoomt wird; Ich habe über eine Bilderbox auf so etwas gehofft. Im Moment sieht es aus wie this Aber ich würde lieber ein klareres und sauberes Bild wie this (Die zweite ist, wie es in Monogame erscheinen wird). Ich habe keinen Code dafür hochgeladen, aber nehme an, dass ich ein Bild aus dem Filestream genommen habe und den Bitmap-Konstruktor verwendet habe, um es zu skalieren (denke nicht, dass das relevant ist, aber ich werde es einfach da draußen veröffentlichen).CSharp Windows Form Picturebox Zeichne kleines Bild ohne Qualitätsverlust

Image croppedImage, image = tileMap.tileBox.Image; 
var brush = new SolidBrush(Color.Black); 

try { croppedImage = CropImage(image, tileMap.highlightedRect); } catch { 
    return; // If crop target is outside bounds of image then return 
} 

float scale = Math.Min(higlightedTileBox.Width/croppedImage.Width, higlightedTileBox.Height/image.Height); 

var scaleWidth = (int)(higlightedTileBox.Width * scale); 
var scaleHeight = (int)(higlightedTileBox.Height * scale); 

try { higlightedTileBox.Image = new Bitmap(croppedImage, new Size(scaleWidth, scaleHeight)); } catch { 
    return; // Image couldn't be scaled or highlighted tileBox couldn't be set to desired image 
} 

CropImage:

private static Image CropImage(Bitmap img, Rectangle cropArea) { 
    return img.Clone(cropArea, img.PixelFormat); 
} 

private static Image CropImage(Image img, Rectangle cropArea) { 
    return CropImage(new Bitmap(img), cropArea); 
} 

Der obige Code ist meine aktuelle Methode in seiner Gesamtheit. tileMap ist ein Formular und tilebox ist die Bildbox in diesem form.image ist die vollständige Spritesheet-Textur, bevor sie auf das zugeschnitten wird, was der Benutzer markiert hat. Nach dem Beschneiden versuche ich, das Bild der aktuellen PictureBox (markiertesTileBox) auf eine vergrößerte Version des zugeschnittenen Bildes zu setzen.

+0

wir brauchen mehr Code! – leAthlon

+1

Okay, gib mir eine Sekunde –

+1

@leAthlon Ich habe etwas mehr Code hinzugefügt :) –

Antwort

1

Also habe ich eine Lösung, indem ich ein bisschen herumprobieren. Es sieht so aus, als würde die Skalierung von Bildern direkt nach Größe eine Art Interpolation verwenden. Um verschiedene von Winforms unterstützte Interpolationsmodi auszuprobieren, habe ich eine kleine Demo erstellt. Wie Sie sehen können, enthält jedes Label den Namen des InterpolationsMode und wird gefolgt von dem resultierenden Bild. Die ursprüngliche Bitmap, die ich verwendete, ist die kleine oben. enter image description here Von Ihrer Frage, es sieht so aus, als ob Sie etwas wie NearestNeighbour erreichen möchten.

Folgende Code-Skalen bmp und das Ergebnis wird in bmp2 gespeichert. Versuchen Sie es, wenn Sie das wollen. Ziehen Sie in Erwägung, eine geeignete Implementierung zu erstellen, wenn Sie dies als Lösung verwenden (unbenutzte Bitmaps usw.). Ich hoffe es hilft.

 Bitmap bmp = new Bitmap("test.bmp"); 
     Bitmap bmp2; 
     Graphics g = Graphics.FromImage(bmp2=new Bitmap(bmp.Width * 2, bmp.Height * 2)); 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
     g.DrawImage(bmp, 0, 0, bmp.Width * 2, bmp.Height * 2); 
     g.Dispose(); 
+0

Thnx Ich werde das ausprobieren. Ich habe gerade eine Stunde damit verbracht, ein XNA-Steuerelement für mein Formular zu erstellen, aber das scheint einfacher zu sein, also werde ich es einfach löschen. –

+1

Ja endlich habe ich es funktioniert. Thnx so viel :) –

+0

Wenn es das ist, was Sie wollten, sollten Sie die Antwort akzeptieren. – leAthlon