Czy istnieje tani sposób na uzyskanie wymiarów obrazu (jpg, png, ...)? Najlepiej byłoby to osiągnąć używając tylko standardowej biblioteki klas (ze względu na ograniczenia hostingowe). Wiem, że powinno być stosunkowo łatwo odczytać nagłówek obrazu i sam go przeanalizować, ale wygląda na to, że coś takiego powinno już tam być. Sprawdziłem również, że następujący fragment kodu odczytuje cały obraz (którego nie chcę):
using System;
using System.Drawing;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Image img = new Bitmap("test.png");
System.Console.WriteLine(img.Width + " x " + img.Height);
}
}
}
c#
.net
image
image-manipulation
Jan Zich
źródło
źródło
Odpowiedzi:
Najlepszym rozwiązaniem jest znalezienie dobrze sprawdzonej biblioteki. Jednak powiedziałeś, że jest to trudne, więc oto jakiś podejrzany, w dużej mierze nieprzetestowany kod, który powinien działać w sporej liczbie przypadków:
Miejmy nadzieję, że kod jest dość oczywisty. Aby dodać nowy format pliku, dodajesz go do
imageFormatDecoders
klucza będącego tablicą „magicznych bitów”, które pojawiają się na początku każdego pliku o podanym formacie, a wartością jest funkcja wyodrębniająca rozmiar ze strumienia. Większość formatów jest dość prosta, jedynym prawdziwym smrodem jest jpeg.źródło
throw e;
ale po prostuthrow;
zamiast tego. Twoje komentarze do dokumentu XML dotyczące drugiego dokumentuGetDimensions
również wyświetlają siępath
zamiastbinaryReader
validateImageData
zestaw dofalse
zapobiega GDI + wykonywanie kosztownych analizy danych obrazu, co poważnie skraca czas ładowania. To pytanie rzuca więcej światła na ten temat.źródło
new Bitmap()
.Czy próbowałeś użyć klas WPF Imaging?
System.Windows.Media.Imaging.BitmapDecoder
itp.?Uważam, że podjęto pewne wysiłki, aby upewnić się, że te kodeki odczytują tylko podzbiór pliku w celu określenia informacji nagłówka. Warto to sprawdzić.
źródło
Szukałem czegoś podobnego kilka miesięcy wcześniej. Chciałem przeczytać typ, wersję, wysokość i szerokość obrazu GIF, ale nie mogłem znaleźć nic przydatnego w Internecie.
Na szczęście w przypadku GIF-a wszystkie wymagane informacje były w pierwszych 10 bajtach:
PNG są nieco bardziej złożone (szerokość i wysokość to 4 bajty):
Jak wspomniano powyżej, wotsit to dobra strona ze szczegółowymi specyfikacjami dotyczącymi formatów obrazów i danych, chociaż specyfikacje PNG w pnglib są znacznie bardziej szczegółowe. Uważam jednak, że wpis w Wikipedii dotyczący formatów PNG i GIF jest najlepszym miejscem do rozpoczęcia.
Oto mój oryginalny kod do sprawdzania GIF-ów, spasowałem też coś dla PNG:
źródło
Na podstawie dotychczasowych odpowiedzi i dodatkowych wyszukiwań wydaje się, że w bibliotece klas .NET 2 nie ma dla niej funkcjonalności. Postanowiłem więc napisać własną. Oto bardzo przybliżona wersja tego. W tej chwili potrzebowałem go tylko do JPG. Tak więc uzupełnia odpowiedź zamieszczoną przez Abbasa.
Nie ma sprawdzania błędów ani żadnej innej weryfikacji, ale obecnie potrzebuję go do ograniczonego zadania i ostatecznie można go łatwo dodać. Przetestowałem to na kilku obrazach i zwykle nie czyta więcej niż 6K z obrazu. Myślę, że to zależy od ilości danych EXIF.
źródło
Zrobiłem to dla pliku PNG
źródło
Tak, absolutnie możesz to zrobić, a kod zależy od formatu pliku. Pracuję dla dostawcy obrazowania ( Atalasoft ), a nasz produkt zapewnia GetImageInfo () dla każdego kodeka, który robi minimum, aby znaleźć wymiary i inne łatwe do uzyskania dane.
Jeśli chcesz stworzyć własny, proponuję zacząć od wotsit.org , który zawiera szczegółowe specyfikacje dla prawie wszystkich formatów obrazów i zobaczysz, jak zidentyfikować plik, a także gdzie można znaleźć informacje.
Jeśli nie przeszkadza Ci praca w C, możesz skorzystać z darmowego jpeglib, aby uzyskać te informacje. Założę się, że można to zrobić z bibliotekami .NET, ale nie wiem jak.
źródło
new AtalaImage(filepath).Width
powoduje coś podobnego?Atalasoft.Imaging.Codec.RegisteredDecoders.GetImageInfo ( fullPath ) .Size
Zaktualizowana odpowiedź ICR na obsługę progresywnych jPegów i WebP :)
źródło
Będzie to zależeć od formatu pliku. Zwykle podają to we wczesnych bajtach pliku. Zwykle weźmie to pod uwagę dobra implementacja do odczytywania obrazów. Nie mogę jednak wskazać ci jednego dla .NET.
źródło