Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2013, 15:00   #1
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию Как получить размер dds-файла?

Всем привет! Есть задача, нужно получить размер dds-файла с его заголовка. Вот код, который "работает":

Код:
program dds;

uses
  Windows, SysUtils, FastCode, DDSCommon, Math;

{$APPTYPE CONSOLE}

var
  hFile, Readed: THandle;
  DDSH: DDSHeader;
  CurH, MinSize: Longword;
  x: Integer;
  Size: Int64;

begin
  hFile:= CreateFile(PAnsiChar('1.dds'), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);  
  ReadFile(hFile, DDSH, SizeOf(DDSH), Readed, nil);

  Size:= SizeOf(DDSHeader)+DDSH.SurfaceDesc.dwPitchOrLinearSize;

  CurH := DDSH.SurfaceDesc.dwPitchOrLinearSize;
  for x := 1 to DDSH.SurfaceDesc.dwMipMapCount-1 do
  begin
    CurH := CurH div 4;
    Inc(Size, Max(0 {minsize}, CurH));
  end;

  Writeln(Size);
  CloseHandle(hFile);
end.
DDSCommon.pas:
Код:
unit DDSCommon;

interface

const DDSD_CAPS        = $00000001;
      DDSD_HEIGHT      = $00000002;
      DDSD_WIDTH       = $00000004;
      DDSD_PITCH       = $00000008;
      DDSD_PIXELFORMAT = $00001000;
      DDSD_MIPMAPCOUNT = $00020000;
      DDSD_LINEARSIZE  = $00080000;
      DDSD_DEPTH       = $00800000;

const DDPF_ALPHAPIXELS = $00000001;
      DDPF_FOURCC      = $00000004;
      DDPF_RGB         = $00000040;

const DDSCAPS_COMPLEX  = $00000008;
      DDSCAPS_TEXTURE  = $00001000;
      DDSCAPS_MIPMAP   = $00400000;

const DDSCAPS2_CUBEMAP           = $00000200;
      DDSCAPS2_CUBEMAP_POSITIVEX = $00000400;
      DDSCAPS2_CUBEMAP_NEGATIVEX = $00000800;
      DDSCAPS2_CUBEMAP_POSITIVEY = $00001000;
      DDSCAPS2_CUBEMAP_NEGATIVEY = $00002000;
      DDSCAPS2_CUBEMAP_POSITIVEZ = $00004000;
      DDSCAPS2_CUBEMAP_NEGATIVEZ = $00008000;
      DDSCAPS2_VOLUME            = $00200000;

type DDPIXELFORMAT = packed record
      dwSize: Cardinal;                     
      dwFlags: Cardinal;                   
      dwFourCC: array[0..3] of char;        
      dwRGBBitCount: Cardinal;            
      dwRBitMask: Cardinal;
      dwGBitMask: Cardinal;                
      dwBBitMask: Cardinal;
      dwRGBAlphaBitMask: Cardinal;          
      dwPOLS: Cardinal;
    end;
    DDCAPS2 = packed record
      dwCaps1: Cardinal;                     
      dwCaps2: Cardinal;                   
      Reserved: array[1..2] of Cardinal;     // Unused
    end;
type DDSURFACEDESC2 = packed record
      dwSize: Cardinal;                      // Size of structure. This member must be set to 124.
      dwFlags: Cardinal;                     // Flags to indicate valid fields. Always include DDSD_CAPS, DDSD_PIXELFORMAT, DDSD_WIDTH, DDSD_HEIGHT.
      dwHeight: Cardinal;                    // Height of the main image in pixels
      dwWidth: Cardinal;                     // Width of the main image in pixels
      dwPitchOrLinearSize: Cardinal;         // For uncompressed formats, this is the number of bytes per scan line (DWORD> aligned) for the main image. dwFlags should include DDSD_PITCH in this case. For compressed formats, this is the total number of bytes for the main image. dwFlags should be include DDSD_LINEARSIZE in this case.
      dwDepth: Cardinal;                     // For volume textures, this is the depth of the volume. dwFlags should include DDSD_DEPTH in this case.
      dwMipMapCount: Cardinal;               // For items with mipmap levels, this is the total number of levels in the mipmap chain of the main image. dwFlags should include DDSD_MIPMAPCOUNT in this case.
      dwReserved1: array[1..11] of Cardinal; // Unused	
      ddpfPixelFormat: DDPIXELFORMAT;        // 32-byte value that specifies the pixel format structure.
      ddsCaps: DDCAPS2;                      // 16-byte value that specifies the capabilities structure.
      dwReserved2: Cardinal;                 // Unused
    end;
type DDSHeader = packed record
      ID: array[0..3] of char;
      SurfaceDesc: DDSURFACEDESC2;
     end;

implementation

end.
Он вроде как получает размер dds. Но если подложить ему dds с типом DXT1, то размер определяется не правильно. Как сделать так, чтобы определялся размер любой dds с любом типом?

P.S. Определять размер файла не вариант вообще ))
RibGeDx вне форума Ответить с цитированием
Старый 16.03.2013, 16:34   #2
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

Посмотри исходники GLScene. Там есть модули для работы с dds, по крайней мере форматы DXT1, DXT3 и DXT5 он открывает нормально.
Develop вне форума Ответить с цитированием
Старый 16.03.2013, 18:03   #3
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию

Develop
Смотрел, ничего толкового не увидел. Мне нужно получать размер DXT1, DXT3, DXT5 и ATI1. Есть еще какие то RAW-изображения, хз, что они из себя представляют. Их размер тоже нужно как то получать ( В msdn есть описание формата, но там нет ничего про получение размера dds.
RibGeDx вне форума Ответить с цитированием
Старый 16.03.2013, 18:26   #4
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

Под "размером dds" имеется ввиду ширина и высота изображения ?
Develop вне форума Ответить с цитированием
Старый 16.03.2013, 18:33   #5
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию

Develop
Нет, размер dds-файла в байтах. Его нужно получить именно из заголовка.
RibGeDx вне форума Ответить с цитированием
Старый 16.03.2013, 18:49   #6
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

В описании формата помойму такого нету.

Может это поможет вычислить размер - dwPitchOrLinearSize или dwPitchOrLinearSize * dwHeight байт.

Вот хороший линк на инфу http://wiki.mirgames.ru/dds
Develop вне форума Ответить с цитированием
Старый 16.03.2013, 20:04   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Размер наверняка вычисляется, исходя их данных, хранимых в заголовке.
Если лень читать документацию, можно попытаться взять по 2-3 файла каждого типа и отдельно вывести для каждого истинный размер файла, а также величины: размер заголовка (DDSHeader), DDSH.SurfaceDesc.dwPitchOrLinearSiz e, а также величину, вычисляемую последним циклом, после чего попытаться подобрать 1-2 мультипликативных коэффициента, чтобы получить желаемый размер файла.
s-andriano вне форума Ответить с цитированием
Старый 16.03.2013, 20:16   #8
RibGeDx
Пользователь
 
Аватар для RibGeDx
 
Регистрация: 10.05.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Размер наверняка вычисляется, исходя их данных, хранимых в заголовке.
Если лень читать документацию, можно попытаться взять по 2-3 файла каждого типа и отдельно вывести для каждого истинный размер файла, а также величины: размер заголовка (DDSHeader), DDSH.SurfaceDesc.dwPitchOrLinearSiz e, а также величину, вычисляемую последним циклом, после чего попытаться подобрать 1-2 мультипликативных коэффициента, чтобы получить желаемый размер файла.
Весь интернет перерыл, нигде подробно не объясняется. Пробовал по разному. Для каждого файла пытался подобрать нужный алгоритм. Но... то в файле dwPitchOrLinearSize = 0, то мипмапы = 0 то еще что то.. А главное, другие программы правильно вычисляют длину )
RibGeDx вне форума Ответить с цитированием
Старый 16.03.2013, 20:56   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Нигде не описания формата dds-файла?
Не верю!
Я сам его в свое время, искал, находил, разбирал и успешно использовал.

Кстати, рекомендую поискать в DX SDK.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как открыть dds-изображения HellMercenariess Мультимедиа в Delphi 1 24.07.2012 12:44
Как отобразить в окне DDS изображение crymchanin Общие вопросы C/C++ 0 15.02.2012 17:53
Как получить размер базы данных Greek9000 Общие вопросы .NET 1 02.08.2011 13:49
Как получить размер строки типа LPCWSTR? Gtx541 Общие вопросы C/C++ 1 30.05.2010 14:18
Как узнать размер файла? photozaz Общие вопросы Delphi 4 01.08.2008 00:29