Sprawdzenie czy plik jest obrazkiem

0

Mam PictureBox, ładuje do niego obrazek, przez OpenFileDialog, mniej więcej w ten sposob:

if (imageDialog.ShowDialog() == DialogResult.OK)
	pix.Image = Image.FromFile(imageDialog.FileName);

Jak sprawdzić czy plik imageDialog.FileName jest obsługiwanym formatem obrazka?
Czy zostaje mi tylko wyłapywanie wyjątków?

if (imageDialog.ShowDialog() == DialogResult.OK)
	try{
		pix.Image = Image.FromFile(imageDialog.FileName);
	}
	catch{
		System.Windows.Forms.MessageBox.Show("Coś nawaliło :P");
	}
0

if (pictureBox1.Image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb)

to może być pomocne :) z tym że przyklad jak widać jest ustawiony na bitmape 24-ro bitową (akurat tego wymagał program)

Object browser mówi że jest jeszcze coś takiego jak System.Drawing.Imaging.ImageFormat ale czy da sie to wykorzystać to musisz sam sprawdzić

0

zapomniałem napisać, że jak wybiorę nie-obrazek (np. plik tekstowy), to wyrzuca OutOfMemoryException ( i chyba niestety pozostanie mi tylko obsłużenie tego wyjątku :| )

a ja szukam czegoś w stylu IsValidImage("c:\plik.aaa");

0

Zawsze mozesz założyć filtr na okno:
imageDialog.Filter = "Bitmapy|*.bmp|Pliki jpeg|*.jpg|Tiff|*.tiff";
Zawsze jest to jakieś ograniczenie użytkownika.

0

:)
wiem... jednak userzy są wredni, zawsze się znajdzie taki user co stwierdzi, że plik .exe albo .pdf to tez obrazek, zaznaczy "All Files", wybierze i sie program zwiesi. :D

0

wcale nie musisz dawać możliwości wybrania pliku o dowolnym rozszerzeniu, przykład który podałem wczytuje tylko pliki bmp, jpg i tiff. Oczywiście "wredny_user" moze zmienić rozszerzenie pliku exe na bmp ale to musiałaby być osoba która na siłe chciałaby zawiesić program i dla takie możliwości mozesz napisać obsługe wyjątku.
A filtr który obsługuje kilka formatów na raz powinien wyglądać tak: imageDialog.Filter = "Pliki obrazów (*.bmp;*.jpg;*.gif;*.tiff)|*.bmp; *.jpg;*.tiff; *.gif ";

0

Raczej pozostaje lapanie wyjatku, bo po to rzuca wyjatek - kiedy format nie jest obslugiwany albo plik nie istnieje. Zreszta taka sytuacja pasuje do definicji sytuacji wyjatkowej :)

0

w sumie racja.. łudziłem sie troche :)... bo np. jest cos takiego jak
System.IO.File.Exists(sciezka); co sprawdza czy plik istnieje, więc pozwala zrezygnować z oblugi wyjatku.

dobra, zostane przy tych wyjątkach :P
Dzięki.

0

Widze że nie probowałeś tego co Ci na początku zaproponowałem, a ja właśnie sprawdziałem i widze że powinno działać.

Sprobuj tak:
Tworzysz tablice formatów plików graficznych:

 System.Drawing.Imaging.PixelFormat[] formaty = new System.Drawing.Imaging.PixelFormat[x]
            {
                System.Drawing.Imaging.PixelFormat.Format16bppArgb1555,
                System.Drawing.Imaging.PixelFormat.Format24bppRgb,
                System.Drawing.Imaging.PixelFormat.Format16bppGrayScale
                .
                .
                itd
            };

następnie przy wczytywaniu pliku przy pomocy pętli sprawdzasz czy jego format jest jednym z tych z tablicy if (pictureBox1.Image.PixelFormat == formaty[i])

z tym, że musiałbyć ustawić sprawdzanie przed wczytaniem do pictureboxa - ale to taki drobny szczegół ;)

0

Taaa, tyle, ze twoj kod zadziala, jesli Image w ogole jest obrazkiem. A jemu najpierw poleci wyjatek, a dopiero pozniej moze sie wziac za jakiekolwiek sprawdzanie formatu (bo przeciez obrazek najpierw sie musi wczytac).

0

własnie, jesli to nie jest obrazek, tylko np. exe to wywali wyjątek zanim zdązy przypisać to do Image.

jest w sumie sposób, że moge sprawdzic naglowek pliku, ale to sie mija z celem, tzn. za duzo roboty :P

0

Co do sprawdzania naglowka, to pewnie to wlasnie robi FromFile i jesli nie pasuje to leci wyjatek. Mysle, ze jakbys to tak robil to bylaby sztuka dla sztuki ;)

0

więc nie ma chyba co gdybać dalej... jade z wyjątkami i juz :D

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