Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] получение разрешения из JPEG и GIF 
:(
    Опции темы
DeathKnight
Дата 5.5.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



необходимо достать информацию о разрешении из файлов этих форматов.
пытался посчитать по спецификациям форматов, но не получается нужный результат.(я могу просто что-то путать)
где лежит информация в файлах(сколько байт и с какого адреса)?
плиз, прошу помочь. гуглить нет возможности.
PM   Вверх
Alexeis
Дата 5.5.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



  У жпега расположения этой структуры не фиксировано. Нужно перебирать блоки в поисках нужного у меня есть алгоритм на паскале, при желании можно переписать на С
Для Гифа все намного проще, по смещению от начала 7й и 8й байты ширина (одинарное слово),  9й и 10й высота(одинарное слово).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
taiven
Дата 5.5.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 30.6.2008

Репутация: нет
Всего: 9



для гифа
Код

#include <cstdio>

using namespace std;

int main(void)
{
    FILE *fp; 
    unsigned short var = 0; 
    fp = fopen("example.gif", "rb"); 

    //Width
    fseek(fp, 6, SEEK_SET); 
    fread(&var, sizeof(unsigned short), 1, fp); 
    printf("%ix", var);

    //Height    
    fseek(fp, 8, SEEK_SET); 
    fread(&var, sizeof(unsigned short), 1, fp); 
    printf("%i\n", var);

    fclose(fp);
    return 0;
}

PM   Вверх
DeathKnight
Дата 5.5.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



Цитата(Alexeis @  5.5.2009,  15:35 Найти цитируемый пост)
Нужно перебирать блоки в поисках нужного у меня есть алгоритм на паскале, при желании можно переписать на С


скинь плиз, попробую разобрать.
PM   Вверх
Alexeis
Дата 5.5.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(DeathKnight @  5.5.2009,  18:25 Найти цитируемый пост)
скинь плиз, попробую разобрать. 

http://forum.vingrad.ru/topic-105564/view-all.html


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DeathKnight
Дата 5.5.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



ой блин...(
я так понимаю, вот это код?
Код

function SwapWord(AWord: Word):Word;
var
  TmpByte : Byte;
  TmpWord : Word;
begin
  TmpByte := AWord AND $00FF;
  TmpWord := TmpByte;
  TmpByte := (AWord SHR 8) AND $00FF;
  Result  := (TmpWord SHL 8) + TmpByte;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  f : TFileStream;
  b1, b2 : Byte;
  w : Word;
  wdth, hght : Word;
begin
  if dlgOpen1.Execute
  then
    begin
       f := TFileStream.Create(dlgOpen1.FileName, fmOpenRead or fmShareDenyWrite);
       f.Seek(2, soBeginning);
       w := 2;
       repeat
          f.Seek(w - 2, soFromCurrent);
          f.ReadBuffer(b1, 1);
          f.ReadBuffer(b2, 1);
          //Обход баластных блоков
          if (b1 <> $FF) or (b2 = $00) or (b2 = $FF)
          then
            Begin
              repeat
                f.Position := f.Position - 1;
                f.ReadBuffer(b1, 1);
                f.ReadBuffer(b2, 1);
              until ((f.Position + 2) > f.Size) or
                    ((b1 = $FF) and (b2 <> $00) and (b2 <> $FF));
              if (f.Position + 2) > f.Size
              then
                Break
            end;
          f.ReadBuffer(w, 2);
          w := SwapWord(w);
       until ((b1 = $FF) and (b2 in [$C0, $C1, $C2])) or ((f.Position + w + 4) > f.Size);
       if (f.Position + w + 4) > f.Size
       then
         Begin
           ShowMessage('fail');
           Exit;
         end;
       f.Seek(1, soFromCurrent);
       f.ReadBuffer(hght, 2);
       f.ReadBuffer(wdth, 2);
       hght := SwapWord(hght);
       wdth := SwapWord(wdth);
       ShowMessage(intToStr(wdth) + 'x' + intToStr(hght));
       f.Free;
    end;
end;

на си его может кто-нибудь перегнать? 

а то не знаю сколько времени на это уйдет, я делфи(паскаль) не знаю, а тут немаленькая такая функция.
PM   Вверх
cardinal
Дата 5.5.2009, 21:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
DeathKnight
Дата 7.5.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



Код

void fJPG(struct graphf *s, char *path)
{
    FILE *f;
    fpos_t n;
    unsigned short int blsize, k;
    unsigned char mas[5]={0,};

    f=fopen(path, "rb");
    s->rezW=s->rezH=0;
    fread(mas, 1, 4, f);

    if(mas[0]==0xFF && mas[1]==0xD8 && mas[2]==0xFF && mas[3]==0xE0)
    {
        fseek(f, 6, SEEK_SET);
        fread(mas, 1, 5, f);
        if(!strcmp(mas, "JFIF"))
        {
            //fseek(f, 4, SEEK_SET);
            //fread(&blsize, sizeof(unsigned short int), 1, f);
            while(!feof(f))
            {
                //fseek(f, blsize, SEEK_CUR);
                fread(mas, 1, 1, f);
                if(mas[0]==0xFF)
                {
                    fread(mas, 1, 1, f);
                    if(mas[0]==0xC0 || mas[0]==0xC1 || mas[0]==0xC2 || mas[0]==0xC3)
                    {
                        fseek(f, 3, SEEK_CUR);
                        fread(&k, sizeof(unsigned short int), 1, f);
                        s->rezH=k;
                        fread(&k, sizeof(unsigned short int), 1, f);
                        s->rezW=k;
                        fclose(f);
                        return;
                    }
                }
                if(feof(f))break;
            }
        }
    }
    fclose(f);
}


вот написал код, но что-то не так.
как изменить надо?
PM   Вверх
cardinal
Дата 7.5.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



DeathKnight, пошаговая отладка тебе в помощь...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.4766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.