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ść.
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;
}
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?
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
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.