Главная » 2D графика » Обзор формата DIB и компонентов для работы с ним

RSS

Обзор формата DIB и компонентов для работы с ним

Не нравитсяНравится   Рейтинг 0

TDIB ( TDXDib )

Данный компонент входит в состав небезызвестного набора для работы с DirectX – DelphiX. Позволю себе некоторое отступление и расскажу о модулях и компонентах для работы с DirectX. Если бы Вы писали на C++ все было бы очень просто: перед выходом очередной версии DirectX, всеми любимая фирма Microsoft выпускает так называемый пакет для разработчиков, в простонародье SDK. Этот пакет содержит кучу полезных утилит, примеров, справочной информации и собственно заголовков для очередной версии библиотеки DirectX. Занимает все это несколько сотен мегабайт -да здравствует линия T1, хотя версии SDK можно найти и на пиратских дисках. Естественно компания Microsoft ни как не поддерживает пользователей Delphi, и все адаптации «сишных» модулей выпускаются исключительно энтузиастами. От сюда понятно почему существует такое малое количество информации по DirectX применительно к языку Object Pascal. Но все же, существует несколько вариантов библиотек для DirectX и в версиях для Delphi.

Непосредственно сами заголовки для DirectX выпускаются достаточно оперативно, и их всегда можно скачать по адресу: http://www.delphi-jedi.org/DelphiGraphics

Но ведь это простые заголовки, а Вам наверняка захочется воспользоваться удобством VCL. Вот здесь Вам и поможет набор компонентов DelphiX. Его можно скачать по адресу: http://www.yks.ne.jp/~hori/ В интернете Вы сможете найти множество описаний для работы с данным компонентом, большое количество игр и примеров ( некоторые из них представлены и на моем сайте в разделах game source и samples ). Данный проект получил широкое распространение в сети интернет и если Вам затруднительно писать программы, используя только заголовки DirectX, то данный набор компонентов будет оптимальным решением.

Лирическое отступление закончено, начинаем знакомство с самим компонентом.

Сам компонент находится в модуле DIB.pas и там Вы сможете найти две его версии TDXDib – VCL версия, и как обычный класс TDIB.

Компонент является наследником класса TGraphic. Приведу все public свойства и методы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ColorTable: TRGBQuads;
PixelFormat: TDIBPixelFormat;
constructor Create; override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure Clear;
procedure Compress;
procedure Decompress;
procedure FreeHandle;
procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE); override;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE); override;
procedure SaveToStream(Stream: TStream); override;
procedure SetSize(AWidth, AHeight, ABitCount: Integer);
procedure UpdatePalette;
procedure Blur(ABitCount: Integer; Radius: Integer);
procedure Greyscale(ABitCount: Integer);
procedure Mirror(MirrorX, MirrorY: Boolean);
procedure Negative;
 
property BitCount: Integer read FBitCount write SetBitCount;
property BitmapInfo: PBitmapInfo read GetBitmapInfo;
property BitmapInfoSize: Integer read GetBitmapInfoSize;
property Canvas: TCanvas read GetCanvas;
property Handle: THandle read GetHandle;
property Height: Integer read FHeight write SetHeight;
property NextLine: Integer read FNextLine;
property NowPixelFormat: TDIBPixelFormat read FNowPixelFormat write SetNowPixelFormat;
property PaletteCount: Integer read GetPaletteCount;
property PBits: Pointer read GetPBits;
property PBitsReadOnly: Pointer read GetPBitsReadOnly;
property Pixels[X, Y: Integer]: DWORD read GetPixel write SetPixel;
property ScanLine[Y: Integer]: Pointer read GetScanLine;
property ScanLineReadOnly[Y: Integer]: Pointer read GetScanLineReadOnly;
property Size: Integer read FSize;
property TopPBits: Pointer read GetTopPBits;
property TopPBitsReadOnly: Pointer read GetTopPBitsReadOnly;
property Width: Integer read FWidth write SetWidth;
property WidthBytes: Integer read FWidthBytes;

Рассмотрим, какие есть плюсы у этого класса. Первое – присутствие процедуры Assign.
Если Вы вдруг захотите загрузить JPEG файл это можно будет с легкостью осуществить. Второе – поддержка всех форматов TGraphic – TBitmap, TIcon, TMetafile. Специально для разработчиков игр предоставлена процедура UpdatePalette. Её можно использовать для вывода различных расс юнитов в играх-стратегиях. Т.е. Вы храните один ресурсовый файл и множество палитр для разных расс, при выводе спрайта на экран меняется только палитра, это позволяет сохранить огромный объем памяти. Так же эта процедура понадобится для таких эффектов как пламя и дым. Но всегда помните операции с палитрой имеют смысл при изображении с количеством цветов менее 256. Если Вы считаете что 256 цветов не достаточно, то это глубокое заблуждение – такие игры как Diablo, StarCraft и т.д. содержат по 20-40 цветов на набор спрайтов ! Обратите внимание на процедуры Blur и Mirror, их так же можно использовать для спецэффектов.

TDIBUltra

Компонент состоит из следующих модулей:

DIBultra.pas Version 1.3 1999 LEON Sebastien
DIBFX.pas Version 1.3 1999 LEON Sebastien
DIBType.pas Version 1.3 1999 LEON Sebastien
DIBCodec.pas Version 1.3 1999 LEON Sebastien

Класс TDIBUltra является наследником TObject и располагается в модуле DIBultra.pas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
constructor CreateFromStream (AStream : TStream);
constructor CreateFromResourceName(Instance : THandle ; const ResName: string);
constructor CreateFromResourceID (Instance : THandle ; ResID: Integer);
constructor CreateFromFile (const Filename: string);
constructor Create (Width, Height : Word ; PF : TDUPixelFormat ; pLogPalette : Pointer );
 
procedure BufferToUpdate;
procedure BufferDim (Width, Height : Word);
function BufferOf (AOwner : TObject) : Boolean;
procedure AlphaChanelBlit (Dest : TDIBUltra; x, y, Num : integer);
procedure AlphaBlit (Dest : TDIBUltra; x, y, Dens : integer);
procedure SetAlphaFile( Const MaskFile : String ; Num , Delay : Integer);
procedure SetAlphaMask( Mask : TDIBUltra ; Num , Delay : Integer);
procedure NoAlpha;
procedure MakeTransparent(ColorIndex : Byte);
procedure MakeOpaque;
procedure DrawOn (Dest : TRect ; Canevas : TCanvas ; Xsrc, Ysrc : Integer );
procedure TiledOn (Dest : TRect ; Canevas : TCanvas);
procedure StretchOn (Dest : TRect ; Canevas : TCanvas);
procedure ClearAll;
procedure ClearClipRect;
procedure PrepareStyle;
procedure RotateStyle (n : Byte);
procedure FillRect (R : TRect);
procedure MoveTo (x1,y1 : Integer);
procedure LineTo (x2,y2 : Integer);
procedure StepTo (dx,dy : Integer);
procedure Plot (Nx,Ny : Integer);
procedure SetPalette (pLogPalette : Pointer);
function StdIndex (Cl : TDUColor) : TColorIndex;
procedure SaveToFile (const Filename: string ; SavingMode : TSaveMode ; FinalBpp : TDUPixelFormat);
procedure SaveToStream(AStream : TStream ; SavingMode : TSaveMode ; FinalBpp : TDUPixelFormat);
 
procedure DirectPlot (Nx, Ny : Integer; ColIdx : TColor );
procedure DirectLineTo(Sg : TLine);
property Pixels [X,Y: Integer]: TColor read GetPixel write SetPixel;
property PixelsIndex[X,Y: Integer]: TColorIndex read GetPixelIndex write SetPixelIndex;
property BrushColor : TColor read ColorBrh Write SetBrhColor default ClBlack;
property PenColor : TColor read ColorPen Write SetPenColor default ClWhite;
property BrushColorIndex : TColorIndex read GetBrushColorIndex Write SetBrushColorIndex default 0;
property PenColorIndex : TColorIndex read GetPenColorIndex Write SetPenColorIndex;
property PenWidth : LongInt read WidthPen Write SetWidthPen default 1;
property PenStyle : LongInt read Mask Write SetMask default DUpsSolid;
property ClipRect : TRect read ClpRect Write SetClipRect;
property GDIStyle : Boolean read NotLast Write NotLast default False;
property LZHFormat : Boolean read RLZH Write WLZH;
property ScanLine[R:Integer]:Pointer read GetScanLine;
property Bits : Pointer read DIBBits; property PixelFormat: TDUPF read DIBResol;
property Canvas : TCanvas read Cnv;
property Width : Integer read DIBWidth;
property Height : Integer read DIBHeight;
property Size : Integer read DIBSize;
property Status : TDIBType read DIBStatus;
property Header : Pointer read PDIBheader;
property Handle : THandle read DIBHandle;
property Hpalette : hPalette read DIBHPalette;
property Bpp : Integer read DIBBpp;
property ByteWidth : Integer read DIBWidth_b;

Страницы : 1 2 3 4 5 6

Таги: ,