2011-12-01 10 views
17

Wiem, że nie istnieje żadna funkcja .Net, która istnieje dla sprawdzenia, ale czy istnieje algorytm lub prosty i skuteczny sposób sprawdzenia, czy bajt jest poprawnym obrazem, zanim użyję tablicy bajtów. Potrzebuję tego, ponieważ wysyłam różne polecenia do serwera, który ciągle nasłuchuje klienta, a jednym z poleceń jest pobranie zrzutów ekranu komputera serwera.Jak sprawdzić, czy tablica bajtów jest prawidłowym obrazem?

+0

Każdy obraz ma nagłówek w określonym formacie. Zawsze możesz to sprawdzić. –

Odpowiedz

27

Można spróbować wygenerować obraz z tablicy bajtów i sprawdzić, czy nie jest to ArgumentException.

public static bool IsValidImage(byte[] bytes) 
{ 
    try { 
     using(MemoryStream ms = new MemoryStream(bytes)) 
      Image.FromStream(ms); 
    } 
    catch (ArgumentException) { 
     return false; 
    } 
    return true; 
} 
+8

Nie uważam tego za "sprawdzanie przed użyciem tablicy bajtów". –

8

Jak już wspomniano, próba załadowania go do obrazu jest jedyną metodą awaryjną. Możesz sprawdzić numer magika jako nagłówek pliku na podstawie [oczekiwanego] typu obrazu. Na przykład, pierwsze 8 oktetów z pliku * .png są w hex:

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A 

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

Większość innych typów plików graficznych mają podobne numery Magick.

Ale sprawdzenie, czy nie powie Ci, czy plik jest prawidłowym plikiem graficznym. Wszystko, co będziesz wiedzieć później, to fakt, że liczba magów wydaje się wskazywać, że jest to plik typu X. Nadal może być obcięty lub w inny sposób uszkodzony, lub nawet być czymś zupełnie innym, co po prostu ma odpowiednią sekwencję oktetów w właściwe miejsce.

2

Dla pliku JPEG można sprawdzić, czy pierwsze dwa bajty to 0xFF, 0xD8, a ostatnie dwa to 0xFF, 0xD9. Oczywiście nadal jest możliwe, że dane obrazu będą pasować do znacznika EOI, ale powinno to być rzadkie.

-1

Według mnie, jeśli chcesz tylko wejścia obrazu (Proper obrazu), a następnie należy udać się akceptować atrybut pola wprowadzania takiego:

input type = "file" name = "uploadedFile" id =” imageContent "class =" required "accept =" image/* "/>

To da ci tylko obrazy na wejściu. Możesz więc swobodnie kodować backend. Bez obawy o obraz jest ważny, czy nie.

I nawet można określić konkretny typ obrazu, jeśli chcesz jak:

input type = "file" name = "uploadedFile" id = class "imageContent" = "wymagane" Accept = "image/jpeg, obrazu/gif, image/png ">

+0

Zakłada to, że użytkownik nie jest złośliwym użytkownikiem, przeglądarka odpowiednio obsługuje te atrybuty oraz kilka innych rzeczy do rozważenia. ZAWSZE zabezpieczaj swój back-end tak bardzo, jak to możliwe, ponieważ walidacja po stronie klienta jest niestety niewiarygodna. –

Powiązane problemy