Rozpoznawanie pliku graficznego

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Rozpoznawanie pliku graficznego

Nowy postprzez Koziol » piątek, 4 grudnia 2009, 14:56

W jaki sposób rozpoznać typ pliku graficznego (tylko formaty bmp, jpg, gif(statyczny) oraz png) ale nie po rozszerzeniu?

Sytuacja ma się tak:

mamy plik a.bmp i chce sprawdzić czy jego zawartością jest faktycznie bmp czy może png, gif, jpg.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez polymorphism » piątek, 4 grudnia 2009, 16:02

Jedyny sensowny sposób jaki mi się nasuwa to czytać (częściowo) nagłówki tych plików. Na ogół formaty plików zawierają jakieś charakterystyczne dane, pozwalające na szybką weryfikację formatu, np. JFIF, BM, PNG.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez Cyfrowy Baron » piątek, 4 grudnia 2009, 16:56

Czytanie nagłówków nie sprawdzi się w przypadku plików graficznych wykorzystujących kompresję np. JPEG.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez polymorphism » piątek, 4 grudnia 2009, 17:35

Czyżby? 8-)
Kod: Zaznacz cały
bool is_jpeg_file(istream &is)
{
   unsigned short    soi;
   unsigned short    app0;
   char         sign[5];

   if(!is.read((char*)&soi,2) || soi != 0xD8FF)return false;

   is   .read((char*)&app0,2)
      .seekg(2,ios::cur)
      .read(sign,5);

   return (is && app0 == 0xE0FF && strcmp(sign,"JFIF") == 0);
}

Funkcję napisałem na podst. infa z wikipedii. Nie wnikałem w szczegóły, być może czegoś nie uwzględniłem. Analogicznie można napisać funkcje dla innych typów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez Cyfrowy Baron » piątek, 4 grudnia 2009, 17:58

Rzeczywiście! Przeglądałem hexy i nie zauważyłem...

Tylko nasuwa się pytanie dlaczego nie podałeś od razu kodu? To forum temu właśnie służy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez polymorphism » piątek, 4 grudnia 2009, 18:34

Bo czasem warto, żeby pytający się wysilił, wszak to jego problem, nie mój.

A że mam słabość do takich maleństw, no to jeszcze jedna funkcja:
Kod: Zaznacz cały
bool is_png_file(istream &is)
{
   unsigned char sign;
   char tmp[4];
   unsigned int size;

   if(!is.read((char*)&sign,1) || sign != 0x89)return false;
   if(!is.read(tmp,3) || strncmp(tmp,"PNG",3))return false;

   is.seekg(4,ios::cur);

   while(is.read((char*)&size,4).read(tmp,4))
   {
      char* p = (char*)&size;
      swap(p[0],p[3]);
      swap(p[1],p[2]);

      is.seekg(size,ios::cur).seekg(4,ios::cur);
      if(strncmp(tmp,"IEND",4) == 0)return true;
   }

   return false;
}

____
p.s. niektóre inty czy shorty powinny być zamienione odpowiednio na int16_t i int32_t. To jest ważne przy czytaniu binarnym z pliku.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez Cyfrowy Baron » piątek, 4 grudnia 2009, 18:57

Bo czasem warto, żeby pytający się wysilił, wszak to jego problem, nie mój.


To czego Ty tu szukasz. Zajmij się własnymi problemami i nie przejmuj się nami maluczkimi.



Mało praktyczne te Twoje rozwiązania, gdyż do każdego rodzaju pliku trzeba tworzyć odrębną funkcję. To już lepiej posłużyć się klasą TGraphic i z niej odczytywać tym pliku, np:

Kod: Zaznacz cały
    String typ = Image1->Picture->Graphic->GetNamePath();
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez polymorphism » piątek, 4 grudnia 2009, 20:04

To czego Ty tu szukasz. Zajmij się własnymi problemami i nie przejmuj się nami maluczkimi.

A coś ty się tak spiął? Czasem jest tak, że pytający chce potwierdzenia tego, na co sam wpadł, ale nie jest pewien, czy nie ma jakiegoś prostszego rozwiązania. Nie trzeba od razu dawać gotowego rozwiązania.

Dawanie gotowców rozleniwia.



Mało praktyczne te Twoje rozwiązania, gdyż do każdego rodzaju pliku trzeba tworzyć odrębną funkcję.

:lol: Bo widzisz, programowanie już takie "mało praktyczne" bywa. Czasem trzeba napisać coś od siebie w większej ilości.

To już lepiej posłużyć się klasą TGraphic i z niej odczytywać tym pliku

Taaa, ładowanie do pamięci i dekompresowanie pliku tylko po to, żeby zidentyfikować format pliku jest bardzo praktyczne i pr0 8-)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez Koziol » piątek, 4 grudnia 2009, 20:15

A czy w bibliotece windows.h bądź jakiejś pochodnej nie ma funkcji odczytującej mime ? Tak by było najprościej ;)
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Rozpoznawanie pliku graficznego

Nowy postprzez polymorphism » piątek, 4 grudnia 2009, 20:47

Nie wiem. Choć nie zdziwiłbym się, gdyby ta funkcja, o ile istnieje, określała mime na podstawie rozszerzenia, a nie zawartości pliku.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości

cron