czwartek, 14 czerwca 2012

Obsługa formatu Netpbm przez C#

 Wstęp teoretyczny

Format Netpbm odnosi się tak na prawdę do zestawu formatów plikowych służących do przechowywania obrazów. W skład tego pakietu wchodzą trzy podstawowe formaty:
  • PBM - Portable Bit Map
  • PGM - Portable Gray Map
  • PPM - Portable Pixel Map
 Do tego czasem dorzuca się PAM (Portable Arbitrary Map), którego struktura opiera się na zasadach wręcz identycznych do tych odnoszących się do PBM/PGM/PPM (które od teraz zbiorczo będę określał jako PNM - Portable Any Map).
Jeśli kogoś interesuje więcej na temat tego formatu to zapraszam do czytania:
A jeśli nie chcecie zagłębiać się w te techniczne detale (bo i po co?) to potraktujmy ten wstęp teoretyczny za zakończony i przejdźmy do sedna...
Jako, że potrzebowałem możliwości otwierania, edycji i prezentacji grafik zapisanych w formacie PGM, a nie napotkałem na żadną implementację obsługującą w pełni ten format - zarówno wersje zapisane w ASCII (P1-P3), jak i binarnie (P4-P6) - to postanowiłem stworzyć własną implementację tego formatu. A skoro już człowiek pisze obsługę PGM to wielkim trudem nie jest rozszerzenie biblioteki o PPM i PBM (choć z obrazem monochromatycznym było trochę zabawy z racji specyfiki zapisu danych w postaci binarnej - pakowanie 8 wartości w jeden bajt).

Zawartość bibliotek

Przechodząc jednak do sedna. Na moim chomiku (link) można zaopatrzyć się w archiwum z .dll zawierającym klasy obsługujące pliki PNM (wszystko pisane w C#), które to znajdują się w przestrzeni nazw: Runaurufu.Drawing.Netpbm. W tej samej dllce znajduje się również kilka użytecznych klas w przestrzeni Runaurufu.Drawing.Transform.
W paczuszce znajduje się również .dll z Runaurufu.Extension, który to odpowiada za rozszerzanie różnych standardowych typów o użyteczne metody i generalnie na bieżąco jest rozwijana :)

Runaurufu.Drawing.Netpbm

public enum NetpbmFormat{...}
public abstract class PnmImage : ICloneable {...}
public class PbmImage : PnmImage {...}
public class PgmImage : PnmImage {...}
public class PpmImage : PnmImage {...}
public class PamImage : PnmImage {...}

Runaurufu.Drawing.Transform

public class HistogramOperation
{
    public static PnmImage Equalize(PnmImage img){...}
    public static PbmImage Equalize(PbmImage img){...}
    public static PgmImage Equalize(PgmImage img){...}
    public static PpmImage Equalize(PpmImage img){...}
    public static PamImage Equalize(PamImage img){...}
    public static Bitmap Equalize(Bitmap img){...}
}

public class Resize
{
    public static Bitmap ResizeNoAspect(Bitmap img, Size size) {...}
    public static Bitmap ResizeKeepAspect(Bitmap img, Size size) {...}
    public static Bitmap ResizeKeepAspect(Bitmap img, Size size, Color filler, ContentAlignment align) {...}
}

Przykładowe użycie

Interfejs przykładowej aplikacji :)

Do tego w archiwum zawarty jest projekt (VS 2010) pokazujący przykład użycia biblioteki. W kilku słowach jest to program umożliwiający otwarcie plików PNM, ich podgląd i zapis do .bmp, jak również tworzenie plików PNM z otwartych plików bmp :)

 Ogólna uwaga - aplikacja zapisuje dane w formatach P1-P3 i P7, czyli generalnie pliki PNM zapisywane są w ASCII, a jedynie PAM zapisywany (zgodnie ze specyfikacją formatu) jest w formie binarnej. Oczywiście z poziomu kodu można bez trudu "wszystko" zapisać binarnie (drugi argument metody Save() odpowiada za to czy zapis jest binarny, czy też nie).

Słowo na zakończenie

Na koniec kilka informacji dotyczących samych .dll - najnowsze wersje będą sukcesywnie wrzucane na mojego chomika do stosownych folderów:
Tak więc jeśli ktoś chciałby skorzystać z moich wypocin to polecam ściągnąć najnowsze wersje prosto z chomika (paczka z przykładem nie będzie aktualizowana) :)

Brak komentarzy:

Prześlij komentarz