Zaawansowane rysowanie tekstu w C#

06.02.2010 @ 18:44:47 by Rafał Kozik | C# .NET grafika

Pisząc różnego rodzaju aplikacje (i gry), chcielibyśmy czasami mieć większa możliwość dostosowania parametrów rysowanego tekstu niż tylko krój, rozmiar i kolor. W .NET jest to bardzo proste -- pokażę dzisiaj jak łatwo można to osiagnać za pomocą GraphicPath.


Zdradzieckie DPI w plikach PNG

03.09.2009 @ 12:29:41 by Rafał Kozik | .NET C# grafika

Biblioteka GDI+ stara się być czasami sprytniejsza niż byśmy tego chcieli i podczas rysowania uwzględnia informację o DPI zawartą w pliku (jest to chunk pHYs), co czasami może przełożyć się na dziwne rezultaty. Jak dziwne? Weźmy jedną grafikę i narysujmy ją z DPI 72, 96 i 300, efekt jest taki:


Obrazek

Może się przez to okazać, że nasze narzędzia generujące grafiki będą dawać dziwne rezultaty. Na dodatek standardowo używane jest DPI z ustawień systemu (standardowo 96), które użytkownik naszego narzędzia może mieć zmienione.

Niektóre narzędzia przetwarzające obrazy zapisują błędnie informację o DPI, o czym przekonałem się parę dni temu, gdy 1/3 grafik testowych (które sam kiedyś tworzyłem) miała złe DPI.

Jak można temu zaradzić? Jako, że nas będą interesować tylko piksele, możemy zmienić DPI wczytanego obrazu za pomocą metody SetResolution i tak samo zrobić dla obrazu, który generujemy -- dzięki temu wszystkie będą miały takie samo DPI i problem powinien zniknąć.


Extension methods w C#

04.06.2009 @ 20:20:42 by Rafał Kozik | C# .NET

W prawie każdym projekcie można znaleźć statyczną klasę/klasy pomocnicze, które zawierają operacje na jakiś danych, ale nie są obiektem w klasycznym sensie. Przykład takiej klasy:

static class Helper
{
	public static string SHA1(string text)
	{
		byte[] buffer = Encoding.UTF8.GetBytes(text);
		SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();

		string hash = BitConverter.ToString(sha1.ComputeHash(buffer));
		return hash.Replace("-", "");
	}
}

Używamy tego tak:

string sha1 = Helper.SHA1(password);

Jak zrobić, żeby pisać mniej kodu i było wygodniej i czytelniej? W C# 3.0 zostały wprowadzone Extension methods, które nam w tym pomogą.


Compo 3h

15.04.2009 @ 22:39:12 by Rafał Kozik | .NET C# gamedev warsztat programowanie

W poprzedni weekend na warsztacie zostało zorganizowane trzygodzinne compo.

Jeszcze nigdy nie brałem udziału w tak krótkim pisaniu gry na czas, ale postanowiłem, że zobaczę co z tego wyjdzie. Ostatecznie zająłem 2 miejsce i jestem z tego zadowolony.

Gra (oczywiście niedokończona ;)), którą pisałem była klonem crimson landa i wypadła nienajgorzej. Całkiem ciekawe wydają mi się szczegóły techniczne, bo jadąc do domu na święta nie miałem dostępu do swojego kodu i pisałem kompletnie od zera:

  • całość pisana w C# i GDI+ (standardowe rysowanie obiektem Graphics)
  • litery w 'intro' i 'outro' są zapisywane podczas preprocessingu do osobnych bitmap
  • podczas gry nie jest używana rotacja (która to byłaby dość wolna), ale podczas wczytywania danych generuję sporą ilość obróconych wersji robotów i pocisków
  • gdy robot jest niszczony, śmieci po nim pozostające zostają wkomponowane w bitmapę tła

Ciekawostką jest też to, że na procesorze C2D 1.8 GHz, użycie procesora według Menadżera zadań Windows nie przekracza 2%. Jak widać proste gry można spokojnie robić bez jakiejkowiek akceleracji ;)

Grę można zobaczyć tutaj.


Internet Explorer, png i gamma

26.02.2009 @ 23:46:22 by Rafał Kozik | webdev .NET C#

Kiedyś podczas testowania strony w IE okazało się, że pojawił się bardzo dziwny błąd -- obrazy zapisane w plikach png i plikach jpg miały inne odcienie.

Layout został pocięty na mniejsze części i w zależności od zawartości zapisywałem je w odpowiednim formacie (większość grafik przygotowuję w Paint.net). Niestety okazało się, że rezultaty są dziwne:

Obrazek

Bardzo prymitywnym rozwiązaniem było przerobienie wszystkiego na tylko jeden format, ale przez pewien czas się sprawdziło. Przyszedł jednak taki moment, że potrzebowałem nałożyć obraz z przezroczystym tłem (png) na główne tło (jpg) i trzeba było rozwiązać problem.

Jak się okazało, problemem jest chunk gAMA, który jest zapisywany przez Paint.net w plikach png. W GIMP-ie możemy po prostu go nie zapisać i wszystko będzie poprawnie. Nie wiem jednak jak jest w przypadku pozostałych programów graficznych. Chunk ten jest też dodawany gdy zapisujemy obraz w .NET metodą Bitmap.Save, której prawdopodobnie Paint.net używa.

Jeśli mamy już "felerne" pliki, to rozwiązanie jest bardzo proste -- wystarczy pobrać program TweakPNG, a w nim z plików png usunąć chunka gAMA. Zawsze można też otworzyć plik w GIMPie i zapisać bez niego ;)