Biblioteka do konwersji obrazów

0

Cześć
Możecie polecić jakąś bibliotekę do obsługi obrazów?
Chodzi mi najbardziej o konwersję rozszerzeń(np. tiff na jpg), zmianę rozdzielczości oraz zmianę jakość.

1

W samym .NET, w System.Drawing i System.Drawing.Imaging są funkcjonalności, które wystarczają do takich rzeczy.

Do zapisu JPEG z dowolna jakością można posłużyć się takimi funkcjami:

    /// <summary>
    /// Zapis do JPEG z okreslona jakoscia do strumienia - JpegQuality od 0 do 100
    /// </summary>
    /// <param name="Img"></param>
    /// <param name="Str"></param>
    /// <param name="JpegQuality"></param>
    public static void SaveJpeg(Bitmap Img, Stream Str, long JpegQuality)
    {
        ImageCodecInfo BmpImageCodecInfo = GetEncoderInfo("image/jpeg");
        System.Drawing.Imaging.Encoder BmpEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters BmpEncoderParameters = new EncoderParameters(1);
        EncoderParameter BmpEncoderParameter = new EncoderParameter(BmpEncoder, JpegQuality);
        BmpEncoderParameters.Param[0] = BmpEncoderParameter;
        Img.Save(Str, BmpImageCodecInfo, BmpEncoderParameters);
    }

    /// <summary>
    /// Zapis do JPEG z okreslona jakoscia do pliku - JpegQuality od 0 do 100
    /// </summary>
    /// <param name="Img"></param>
    /// <param name="Str"></param>
    /// <param name="JpegQuality"></param>
    public static void SaveJpeg(Bitmap Img, string Str, long JpegQuality)
    {
        ImageCodecInfo BmpImageCodecInfo = GetEncoderInfo("image/jpeg");
        System.Drawing.Imaging.Encoder BmpEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters BmpEncoderParameters = new EncoderParameters(1);
        EncoderParameter BmpEncoderParameter = new EncoderParameter(BmpEncoder, JpegQuality);
        BmpEncoderParameters.Param[0] = BmpEncoderParameter;
        Img.Save(Str, BmpImageCodecInfo, BmpEncoderParameters);
    }

    /// <summary>
    /// Metoda wymagana przez "SaveJpeg"
    /// </summary>
    /// <param name="mimeType"></param>
    /// <returns></returns>
    private static ImageCodecInfo GetEncoderInfo(String mimeType)
    {
        int j;
        ImageCodecInfo[] encoders;
        encoders = ImageCodecInfo.GetImageEncoders();
        for (j = 0; j < encoders.Length; ++j)
        {
            if (encoders[j].MimeType == mimeType)
            {
                return encoders[j];
            }
        }
        return null;
    }
0

Próbowałem tego sposobu, ale wywala się w przypadku gdy obraz jest za duży (sprawdź w tym z załącznika)

I mam pytanie - dlaczego masz hardcodowane

ImageCodecInfo BmpImageCodecInfo = GetEncoderInfo("image/jpeg");

Czy w tym przypadku działa to tylko dla obrazków JPG?

5

ImageMagick to chyba najpopularniejsza biblioteka (wraz z interfejsem dla powłoki) open source. Ma całkiem duże możliwości. Z tego co wiem ma też port do C#/.NET

0
ZielonySzczypior napisał(a):

Próbowałem tego sposobu, ale wywala się w przypadku gdy obraz jest za duży (sprawdź w tym z załącznika)

I mam pytanie - dlaczego masz hardcodowane

ImageCodecInfo BmpImageCodecInfo = GetEncoderInfo("image/jpeg");

Czy w tym przypadku działa to tylko dla obrazków JPG?

Ja nie miałem nigdy problemu, ale możliwe, że takich dużych obrazów nie przetwarzałem. Ten kod po prostu znalazłem szukając odpowiedzi w Google, jak zapisać JPEG z dowolną jakością i tylko lekko dostosowałem do swoich potrzeb. To image/jpeg to nawet nie wiem po co jest i jakie ma znaczenie, ten kod dawał to, co potrzebowałem i tyle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1