通过HH8WilEdit学习WIL 文件编码 9 对MYWIL 单元 的理解,注释

电视直播网365 ⌚ 2025-09-20 08:04:23 👤 admin 👁️ 2756 ❤️ 364
通过HH8WilEdit学习WIL 文件编码 9 对MYWIL 单元 的理解,注释

unit mywil;

interface

uses

Windows, Classes, Graphics, SysUtils, Dialogs, DIB;

const

UseDIBSurface : Boolean = FALSE;

BoWilNoCache : Boolean = FALSE;

MaxListSize=160000; //最大列表字节?

type

TWMImageHeader = record // 图片头记录

Title: string[40]; //'WEMADE Entertainment inc.'

ImageCount: integer; //图片数量

ColorCount: integer; //颜色数量

PaletteSize: integer; //调色板大小?

end;

PTWMImageHeader = ^TWMImageHeader;

TWMImageInfo = record //图片信息

Width: smallint; // 宽

Height: smallint; // 高

px: smallint; //X 偏移

py: smallint; // Y 偏移

bits: PByte; // 字节指针? 内容?

end;

PTWMImageInfo = ^TWMImageInfo;

TWMIndexHeader =record //索引头记录 48

Title: string[40]; //'WEMADE Entertainment inc.'

IndexCount: integer; //索引数量

end;

PTWMIndexHeader = ^TWMIndexHeader;

TWMIndexInfo = record //索引信息记录

Position: integer; // 位置

Size: integer; // 大小

end;

PTWMIndexInfo = ^TWMIndexInfo;

TLibType = (ltLoadBmp, ltLoadMemory, ltLoadMunual, ltUseCache); //库种类枚举

TBmpImage = record //BMPImage 记录

bmp: TBitmap; //BMP域

LatestTime: integer; // 最后时间?

end;

PTBmpImage = ^TBmpImage;

TXY= array[0..65536] of Integer; //这个做什么用的?存储XY偏移量?

//PWTDxImageArr = ^TDxImageArr;

TNewWilHeader=Packed Record //新的wil头记录格式?

Comp :Smallint;

Title :Array[0..19] of Char;

Ver :Smallint;

ImageCount :Integer;

End;

TNewWilImageInfo=Packed Record //新的wil信息记录?

Width :Smallint;

Height :Smallint;

Px :Smallint;

Py :SmallInt;

Shadow :Byte;

Shadowx :Smallint;

Shadowy :Smallint;

Length :Integer;

End;

TNewWixHeader=Packed Record //新的wix头记录 24

Title :Array[0..19] of char; //少个NewWixInfo ?

ImageCount :Integer;

End;

TBitMapHeader=Packed Record //BitMap 文件头记录?

bfType :Word; //bmp文件头标志固定为19778,记bm

bfSize :Integer; //文件大小

bfRes :Integer; //保留,全部为0

bfOffBits :Integer; //记录图像数据区的起始位置

bfTy :Integer; // 图像描述信息块的大小,常为28H

Width :Integer;

Height :Integer;

mark :Word;

Piexl :Word;

Pack :Integer;

Size :Integer;

Width1 :Integer;

Height1 :Integer;

ColorNum :Integer;

unk :Integer;

unk1 :integer;

unk2 :integer;

unk3 :integer;

End;

TWIL = class (TComponent) //WIL 类, 核心组件基础类TComponent

private //私有成员,私有封装,只能在本单元内使用

FFileName: string; //field 域 成员数据

idxfile: string;

FImageCount: integer;

FLibType: TLibType;

FX,FY:TXY; //放置

FBitMap:TBitMap;

Fpx,FPy:Integer;

Fwidth,FHeight:Integer;

FOffSet:Integer;

FType:Integer;

procedure LoadIndex (idxfile: string); //类方法,成员函数 method

procedure LoadBmpImage (position: integer; index:integer);

procedure LoadNewBmpImage (position: integer; index:integer);

function FGetImageBitmap (index: integer): TBitmap;

//保护成员,私有封装,本单元,子类单元使用

protected

lsDib: TDib; //

//公有成员,公有封装,其它单元可用

public

IndexList: Array of Integer;

Stream: TFileStream;

{TRGBQuads = array[0..255] of TRGBQuad;}

MainPalette: TRgbQuads;

NewHeaderofIndex: TNewWixHeader;

headerofIndex: TWMIndexHeader;

// 构造函数

constructor Create (AOwner: TComponent); override;

// 析构函数

destructor Destroy; override;

procedure Tran(value:Integer);

procedure Initialize;

procedure Finalize;

procedure LoadPalette;

function GetCachedBitmap (index: integer): TBitmap;

function Changex(index:Integer;x:Smallint):Boolean;

function Changey(index:Integer;y:Smallint):Boolean;

function AddBitmap(NewBitMap:TBitMap;X,Y:SmallInt):Boolean;

function AddNullBitmap:Boolean;

function ReplaceBitMap(Index:Integer;NewBitMap:TBitMap):Boolean;

property Bitmaps[Index: Integer]: TBitmap read FGetImageBitmap;

procedure DrawZoomEx (paper: TCanvas; Rec:TRect; index: integer; leftzero: Boolean);

procedure DrawZoom (paper: TCanvas; x,y, index: integer; zoom:Real;Tran,leftzero: Boolean);

//发行成员,发行封装,其它单元可用,对象检视器可以显示其中成员。

published

property FileName: string read FFileName write FFileName; //属性 property

property ImageCount: integer read FImageCount;

property LibType: TLibType read FLibType write FLibType;

property px:Integer Read Fpx write Fpx;

property py:Integer Read Fpy write Fpy;

property OffSet:Integer Read FOffSet write FOffSet;

property Width:Integer Read FWidth write FWidth;

property Height:Integer Read FHeight write FHeight;

property FileType:Integer Read FType write FType;

end;

procedure Register;

implementation

procedure FillBitMapHeader(var BitMap:TBitMapHeader);

Begin

Bitmap.bfType:=19778;

Bitmap.bfRes:=0;

Bitmap.bfTy:=40;

BitMap.mark:=1;

BitMap.Piexl:=16;

BitMap.Pack:=3;

BitMap.ColorNum:=0;

BitMap.unk:=0;

bitmap.bfOffBits:=66;

Bitmap.unk1:=63488;

Bitmap.unk2:=2016;

Bitmap.unk3:=31;

Bitmap.Width1:=0;

Bitmap.Height1:=0;

End;

{复制 图片副本? 这里要需要学习API }

function DuplicateBitmap (bitmap: TBitmap): HBitmap;

var

hbmpOldSrc, hbmpOldDest, hbmpNew : HBitmap;

hdcSrc, hdcDest : HDC;

begin

hdcSrc := CreateCompatibleDC (0);

hdcDest := CreateCompatibleDC (hdcSrc);

hbmpOldSrc := SelectObject(hdcSrc, bitmap.Handle);

hbmpNew := CreateCompatibleBitmap(hdcSrc, bitmap.Width, bitmap.Height);

hbmpOldDest := SelectObject(hdcDest, hbmpNew);

BitBlt(hdcDest, 0, 0, bitmap.Width, bitmap.Height, hdcSrc, 0, 0,

SRCCOPY);

SelectObject(hdcDest, hbmpOldDest);

SelectObject(hdcSrc, hbmpOldSrc);

DeleteDC(hdcDest);

DeleteDC(hdcSrc);

Result := hbmpNew;

end;

{改写用VCL }

{function DuplicateBitmap (bitmap: TBitmap): HBitmap;

var

NewBmp: TBitmap;

RectN: TRect;

begin

NewBmp := TBitmap.Create;

NewBmp.Width := bitmap.Width;

NewBmp.Height := bitmap.Height;

NewBmp.Canvas.CopyMode := cmSrcCopy;

RectN := Rect(0, 0, NewBmp.Width, NewBmp.Height);

NewBmp.Height := bitmap.Height;

NewBmp.Canvas.CopyRect(RectN, bitmap.Canvas, RectN);

Result := NewBmp.Handle;

end; }

{分割图片? 不不,是图样的重叠。图样和背景的重叠,实现透明显示效果}

procedure SpliteBitmap (DC: HDC; X, Y: integer; bitmap: TBitmap; transcolor: TColor);

var

hdcMixBuffer, hdcForeMask, hdcCopy : HDC;

hOld, hbmCopy, hbmMixBuffer, hbmForeMask : HBitmap;

oldColor: TColor;

begin

{实际上删除这段语句也可以使用。}

// hbmCopy := DuplicateBitmap (bitmap); //复制的

hbmCopy := bitmap.Handle; //直接引用其句柄

hdcCopy := CreateCompatibleDC (DC); //建立设备,

hOld := SelectObject (hdcCopy, hbmCopy); //装入位图对象?

hdcForeMask := CreateCompatibleDC (DC);

hdcMixBuffer:= CreateCompatibleDC (DC);

{这里才是重点,建立的是1位深的图片,去除用模板一步到位}

{颜色平面数,颜色位数,颜色数据指针,返回一个位图句柄}

hbmForeMask := CreateBitmap (bitmap.Width, bitmap.Height, 1, 1, nil);

hbmMixBuffer:= CreateCompatibleBitmap (DC, bitmap.Width, bitmap.Height); {建立一个环境关联位图对象}

// SelectObject (hdcBackMask, hbmBackMask); //设备 装入对象

SelectObject (hdcForeMask, hbmForeMask);

SelectObject (hdcMixBuffer, hbmMixBuffer);

{不设置背景色为白色的话,显示背景黑,然后没有透明效果}

oldColor := SetBkColor (hdcCopy, transcolor); //$0 clWhite); 设置设备背景色 白色

{单色,前蒙板,黑色轮廓}

BitBlt (hdcForeMask, 0, 0, bitmap.Width, bitmap.Height, hdcCopy, 0, 0, SRCCOPY); //直拷

{还原hdcCopy背景色,不还原背景色的话,也可以透明显示,黑背景显示 }

SetBkColor (hdcCopy, oldColor);

BitBlt( hdcMixBuffer, 0, 0, bitmap.Width, bitmap.Height, DC, X, Y, SRCCOPY ); //DC 作为背景直拷

{背景 AND 前蒙板 }

BitBlt( hdcMixBuffer, 0, 0, bitmap.Width, bitmap.Height, hdcForeMask, 0, 0, SRCAND ); //AND 合并

BitBlt( hdcMixBuffer, 0, 0, bitmap.Width, bitmap.Height, hdcCopy, 0, 0, SRCPAINT ); //OR合并

BitBlt( DC, X, Y, bitmap.Width, bitmap.Height, hdcMixBuffer, 0, 0, SRCCOPY ); //直拷

DeleteObject( SelectObject( hdcCopy, hOld ) );

DeleteObject( SelectObject( hdcForeMask, hOld ) );

DeleteObject( SelectObject( hdcMixBuffer, hOld ) );

DeleteDC( hdcCopy );

DeleteDC( hdcForeMask );

DeleteDC( hdcMixBuffer );

end;

function ExtractFileNameOnly (const fname: string): string;

var

extpos: integer;

ext, fn: string;

begin

ext := ExtractFileExt (fname);

fn := ExtractFileName (fname);

if ext <> '' then begin

extpos := pos (ext, fn);

Result := Copy (fn, 1, extpos-1);

end else

Result := fn;

end;

procedure Register;

begin

RegisterComponents('TOPDELPHI', [TWIL]);

end;

constructor TWIL.Create (AOwner: TComponent);

begin

inherited Create (AOwner); //保留字inherited 调用父类构造函数 Owner 所有者,A 参数 规范起名

FFileName := ''; //F field ,+ 变量名 规范起名

FLibType := ltLoadBmp;

FImageCount := 0;

Stream := nil; //TFileStream

// IndexList := TList.Create;

lsDib := TDib.Create; //DIB uses DIB DIBbitmap

lsDib.BitCount := 8;

lsdib.PixelFormat.RBitMask:=$FF0000;

lsdib.PixelFormat.gBitMask:=$FF00;

lsdib.PixelFormat.bBitMask:=$FF;

FBitMap:=TBitMap.Create; // BITmap

FBitMap.PixelFormat:=pf8bit; //8BIT颜色

FbitMap.Width:=1;

FBitMap.Height:=1;

end;

destructor TWIL.Destroy;

begin

// IndexList.Free;

if Stream <> nil then Stream.Free;

lsDib.Free; //为什么没有FbitMap 的free?

inherited Destroy;

end;

procedure TWIL.Initialize; //wil初始化

var

header: TWMImageHeader;

NewHeader:TNewWilHeader;

s:Pchar;

str:String;

begin //ComponentState属性用来描述组件的状态 ,集合

//csDesigning:Delphi环境是设计方式

if not (csDesigning in ComponentState) then begin

if FFileName = '' then

begin {raise 语句: 抛出异常}

raise Exception.Create ('FileName not assigned..');

exit;

end;

if FileExists (FFileName) then

begin

if Stream = nil then {建立文件流}

Stream := TFileStream.Create (FFileName, fmOpenReadWrite or fmShareDenyNone);

{记录,大小为什么用类定义?而不直接用这个变量的?}

Stream.Read (header, sizeof(TWMImageHeader));

if Header.Title='ILIB v1.0-WEMADE Entertainment inc.' then

FType:=0

else

if Header.Title='WEMADE Entertainment inc.' then

FType:=1

else

Begin

Stream.Seek(0,0); {读新型文件头}

Stream.Read(NewHeader,Sizeof(NewHeader));

// s:=NewHeader.

s:=@NewHeader.Title; {s:Pchar;取地址}

Str:=String(s); {类型转换成STRING }

if Str='ILIB v1.0-WEMADE' then

FType:=2

else

Begin {文件头中没有对应的3种字符串,释放文件流}

stream.Free;

stream:=nil; {设置stream 为空指针}

exit;

End;

End;

if Ftype<2 then {0,1型的WIL文件}

FImageCount := header.ImageCount;

if Stream<>nil then

Begin {载入同名的IDX文件}

idxfile := ExtractFilePath(FFileName) + ExtractFileNameOnly(FFileName) + '.WIX';

LoadIndex (idxfile);

if Ftype<2 then

LoadPalette;

end

else

MessageDlg (FFileName + ' 不是wil文件.', mtWarning, [mbOk], 0);

end else begin

MessageDlg (FFileName + ' 不存在.', mtWarning, [mbOk], 0);

end;

end;

end;

procedure TWIL.Finalize;

var

i: integer;

begin

if Stream <> nil then

begin

Stream.Free;

Stream := nil;

end;

for i:=0 to FImageCount-1 do

SetLength(IndexList,0);

FOffset:=0;

FType:=0;

end;

procedure TWIL.LoadPalette;

var

size,x:integer;

lplogpal:pMaxLogPalette;//

begin

if Foffset=4 then { 1类型 的WIL}

size:=60

else

size:=56;

Stream.Seek (size, 0);

{TRGBQuad是一个 4字节的 record ,B G R 0}

{MainPalette TRGBQuads = array[0..255] of TRGBQuad; }

Stream.Read (MainPalette, sizeof(TRgbQuad) * 256);

{创建调色板 这里需要学习创建调色板。。。。

TRgbQuad是4字节的 record ,B G R 0

lplogpal:pMaxLogPalette;

TLOGPALETTE,

TPALETTEENTRY }

GetMem(lpLogPal, sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));

lpLogPal.palVersion := $0300;

lpLogPal.palNumEntries := 256;

for x := 0 to 255 do

Begin

lpLogPal.palPalEntry[x].peRed := MainPalette[x].rgbRed;

lpLogPal.palPalEntry[x].peGreen := MainPalette[x].rgbGreen;

lpLogPal.palPalEntry[x].peBlue := MainPalette[x].rgbBlue;

End;

FBitmap.Palette := CreatePalette(pLogPalette(lpLogPal)^);

end;

procedure TWIL.LoadIndex (idxfile: string);

var {变量 i, value 没有用上?}

fhandle, i, value: integer;

count:Integer;

// pvalue: PInteger;

begin

// indexlist.Clear;

if FileExists (idxfile) then

begin

fhandle := FileOpen (idxfile, fmOpenRead or fmShareDenyNone);

if fhandle > 0 then

begin

case FType of

0:

Begin

FoffSet:=0;

FileRead (fhandle, headerofIndex, sizeof(TWMIndexHeader));

{ 设置索引列表数组的长度为 索引数量 +1}

SetLength(IndexList,headerofIndex.IndexCount+1);

FileRead (fhandle, IndexList[0], 4*headerofIndex.IndexCount);

End; {4 * 索引数量 个字节}

{ WMIndexInfo 里面有

position:integer;

size: integer

是 4 + 4 个字节,这里读起来好像不够?

实际上并没有读到记录中去,而是读到IndexList数组中

所以这个WMIndexInfo 并没有用,误导?

}

1:

Begin

FoffSet:=4;

FileRead (fhandle, headerofIndex, sizeof(TWMIndexHeader));

SetLength(IndexList,headerofIndex.IndexCount+1);

FileSeek(fHandle,52,0); {52位置,}

FileRead (fhandle, IndexList[0], 4*headerofIndex.IndexCount);

{这里也是4字节?}

if IndexList[0]<>1084 then {1084 标志?}

Begin

FileSeek(fHandle,48,0); {48 位置}

FileRead (fhandle, IndexList[0], 4*headerofIndex.IndexCount);

Ftype:=0; {实际 0 类型WIL文件}

FoffSet:=0;

End;

End;

2:

Begin

count:=0;

Foffset:=0;

FileSeek(fHandle,0,0); {新WIX 的读取 24}

FileRead(Fhandle,NewHeaderofIndex,Sizeof(NewHeaderofIndex));

SetLength(INdexList,NewHeaderofIndex.ImageCount);

FileRead(fHandle,IndexList[0],NewHeaderofIndex.ImageCount*4);

{这里没有用WIL文件的,用了WIX 里面的}

FimageCount:=NewHeaderofIndex.ImageCount;

while (IndexList[0]<0) do

Begin

Inc(count); {这里寻找数据? }

Inc(Foffset);

Dec(FimageCOunt);

FileSeek(fHandle,Sizeof(NewHeaderofIndex) + 4 * count, 0);

FileRead(fHandle,IndexList[0],FimageCOunt*4);

End;

end;

end;

FileClose (fhandle);

end;

end;

end;

{----------------- Private Variables ---------------------}

function TWIL.FGetImageBitmap (index: integer): TBitmap;

begin

Result:=nil; {返回指针空}

if LibType <> ltLoadBmp then exit; {操作方式限制,构建函数中已经设置

FLibType := ltLoadBmp; }

Result := GetCachedBitmap (index);

end;

// *** DirectDrawSurface Functions

{这个不用考虑了,应该是其它版本的WIL 文件,很少见到?}

procedure TWIL.LoadNewBmpImage (position: integer; index:integer);

var

imginfo: TNewWilImageInfo;

buf:Array of word;

//DBits: PByte;

dbits:array of word;

newdib:TDib;

nYCnt,nWidthEnd,nWidthStart,nCntCopyWord,x,nXOffset,nYOffset:Integer;

nStartX,nStartY,nCurrWidth,nLastWidth,nCheck:integer;

lpbi:TBitmapInfo ;

Bheader:TBitMapHeader;

hdib:HWnd;

d:integer;

tmpFile:TMemoryStream;

begin

if Position<=0 then

Begin

FBitMap.Width:=0;

FbitMap.Height:=0;

Exit;

End;

Stream.Seek (position, 0);

Stream.Read (imginfo, sizeof(TNewWilImageInfo));

FX[index]:=ImgInfo.px;

FY[Index]:=ImgInfo.py;

SetLength(Dbits,Imginfo.Width*Imginfo.Height*2);

SetLength(Buf,ImgINfo.Length*2);

Stream.Read (Buf[0], Imginfo.Length*2);

if (ImgINfo.Width>1000) or (ImgInfo.Height>1000) then

Exit;

nXOffset := 0;

nYOffset := 0;

nStartX := 0;

nStartY := 0;

nWidthStart := 0;

nWidthEnd := 0;

nCurrWidth := 0;

nCntCopyWord := 0;

nYCnt :=0;

nLastWidth := 0;

for nycnt:=0 to ImgInfo.Height do

Begin

nWidthEnd:=Buf[nwidthstart]+nWidthEnd;

Inc(nWidthStart);

// for x:=nWidthStart to nwidthend-1 do

x:=nWidthStart;

while x

Begin

if Buf[x]=$c0 then

Begin

// inc(x);

x:=x+1;

nCntCopyWord:=Buf[x];

x:=x+1;

nCurrWidth:=nCurrWidth+nCntCopyWord;

End

else

if (Buf[x]=$c1) then

Begin

Inc(x);

nCntCopyWord:=Buf[x];

Inc(x);

nLastWidth:=nCurrWidth;

nCurrWidth:=nCurrWidth+nCntCopyWord;

if (ImgInfo.Width

x:=x+nCntCopyWord

else

Begin

if (nLastWidth<=ImgInfo.Width) and (ImgInfo.Width

Begin

CopyMemory(@Dbits[(Imginfo.height-nycnt)*ImgInfo.width+nlastwidth],@buf[x],(imginfo.Width-nlastwidth)*2);

x:=x+ncntcopyword;

End

else

Begin

CopyMemory(@Dbits[(Imginfo.height-nycnt)*ImgInfo.width+nlastwidth],@buf[x],nCntCopyWord*2);

x:=x+ncntcopyword;

End;

End;

End

else

Begin

if(Buf[x]=$c2) or (Buf[x]=$c3) then

Begin

Inc(x);

nCntCopyWord:=Buf[x];

Inc(x);

nLastWidth:=nCurrWidth;

nCurrWidth:=nCurrWidth+nCntCopyWord;

if (imginfo.Width

x:=x+ncntcopyword

else

Begin

if (nlastwidth

Begin

for nCheck:=0 to (imginfo.Width-nlastwidth-1) do

Dbits[((imginfo.Height-nycnt)*(imginfo.Width))+(nlastwidth+ncheck)]:= Buf[x+ncheck];

x:=x+nCntCopyWord;

End

else

Begin

for nCheck:=0 to (nCntCopyWord-1) do

Dbits[((imginfo.Height-nycnt)*(imginfo.Width))+(nlastwidth+ncheck)]:= Buf[x+ncheck];

x:=x+nCntCopyWord;

End

End;

End;

End;

end;

Inc(nWidthEnd);

nWidthStart:=nWidthEnd;

nCurrWidth:=0;

End;

d:=0;

// CreateDIBitmap(GetDC(0),lpbih,CBM_INIT,@Dbits,@lpbi,d );

FillBitMapHeader(BHeader);

Bheader.Width:=Imginfo.Width;

BHeader.Height:=Imginfo.Height;

BHeader.Size:=Imginfo.Width*Imginfo.Height*2;

Bheader.bfSize:=66+Imginfo.Width*Imginfo.Height*2;

tmpFile:=TMemoryStream.Create;

TmpFile.SetSize(Imginfo.Width*Imginfo.Height*2+56);

TmpFile.Seek(0,0);

TmpFile.Write(BHeader,66);

TmpFile.Write(DBits[0],Imginfo.Width*Imginfo.Height*2);

TmpFile.Seek(0,0);

FbitMap.LoadFromStream(TmpFile);

TmpFile.Free;

end;

procedure TWIL.LoadBmpImage (position: integer; index:integer);

var

imginfo: TWMImageInfo; //BUFFER

DBits: PByte;

t:TmemoryStream;

begin

Stream.Seek (position, 0);

{这个奇怪的字节数,-4 是因为没有PACKED的原因吗? 加上一个偏移?

还是因为不同WIL 文件类型的原因?

不是的是因为WIL文件不同的版本。。。

所以Foffset = 0

这个4 因为WMIageInfo 最后一个是个Pbyte指针,指针是32位,4字节

指针指向的内容又放在了那里呢?是在文件里面顺序存放的吗?}

Stream.Read (imginfo, sizeof(TWMImageInfo) - 4 + FOffset);

FX[index]:=ImgInfo.px; {写入偏移量}

FY[Index]:=ImgInfo.py;

{计算宽度,设置DIB的数据,宽,高,调色板}

lsDib.Width := (((imginfo.Width*8)+31) shr 5) * 4;

lsDib.Height := imginfo.Height;

lsDib.ColorTable := MainPalette;

lsDib.UpdatePalette;

lsDib.Canvas.Brush.Color:=ClBlack; {刷黑}

lsDib.Canvas.FillRect(Rect(0,0,lsdib.Width,lsdib.Height));

DBits := lsDib.PBits;

Stream.Read (DBits^, imginfo.Width * imgInfo.Height);

if (ImgINfo.Width>2000) or (ImgInfo.Height>2000) then

Exit; {超大图片 退出}

FBitMap.Width := lsDib.Width;

FBitMap.Height := lsDib.Height;

FBitMap.Canvas.Draw (0, 0, lsDib); {绘制到FBitMap中}

lsDib.Clear;

end;

function TWIL.GetCachedBitmap (index: integer): TBitmap;

var

position: integer;

begin

Result := nil;

if (index < 0) or (index >= ImageCount) then

Begin

FBitMap.Width:=1;

FbitMap.Height:=1;

Result:=FBitMap;

exit;

end;

if index < ImageCount then

begin

position := (IndexList[index]);

if Ftype<2 then

LoadBmpImage (position,index)

else

LoadNewBmpImage (position,index);

Result:=FBitMap;

FWidth:=FBitMap.Width;

FHeight:=FBitMap.Height;

end;

Fpx:=Fx[Index];

Fpy:=Fy[Index];

end;

function TWIL.AddBitmap(NewBitMap:TBitMap;X,Y:SmallInt):Boolean;

var

Temp:TFileStream;

DBits:PByte;

v:smallint;

offset:integer;

s:array[0..1] of integer;

Begin

Result:=False;

try

lsDib.Width := (((NewBitMap.Width*8)+31) shr 5) * 4;

lsDib.Height := NewBitMap.Height;

if (NewBitMap.Width<=1)or(NewBitMap.Height<=1) then

Begin

AddNUllBitmap;

Result:=True;

Exit;

End;

lsDib.ColorTable := MainPalette;

lsDib.UpdatePalette;

lsdib.Canvas.Brush.Color:=clblack;

lsDib.Canvas.FillRect(Rect(0,0,lsdib.Width,lsdib.Height));

lsDib.Canvas.Draw(0,0,NewBitmap);

// lsDib.SaveToFile('c:\1.bmp');

if Stream<>nil then

Begin

Inc(FImageCount);

Stream.Seek(44,0);

Stream.Write(FImageCount,4);

//写入图片的宽度

offset:=Stream.Size;

Stream.Seek(0,2);

v:=lsDib.Width;

Stream.Write(v,2);

//写入图片的高度

v:=lsDib.Height;

Stream.Write(v,2);

//写入图片的坐标

Stream.Write(x,2);

Stream.Write(y,2);

DBits:=lsDIb.PBits;

s[0]:=Stream.Write(DBits^,lsdib.Size);//lsDib.Height*lsDib.Width);

Temp:= TFileStream.Create (idxfile, fmOpenReadWrite or fmShareDenyNone);

Temp.Seek(44,0);

Temp.Write(FImageCount,4);

Temp.Seek(0,2);

Temp.Write(Offset,4);

Temp.Free;

End;

Result:=True;

Except

End;

End;

function TWIL.AddNUllBitmap:Boolean;

var

Temp:TFileStream;

offset:Integer;

v:smallint;

vv:Byte;

Begin

Result:=False;

Try

if Stream<>nil then

Begin

Inc(FImageCount);

Stream.Seek(44,0);

Stream.Write(FImageCount,4);

//写入图片的宽度

offset:=Stream.Size;

Stream.Seek(0,2);

v:=1;

Stream.Write(v,2);

Stream.Write(v,2);

Stream.Write(v,2);

Stream.Write(v,2);

vv:=0;

Stream.Write(vv,1);

Temp:= TFileStream.Create (idxfile, fmOpenReadWrite or fmShareDenyNone);

Temp.Seek(44,0);

Temp.Write(FImageCount,4);

Temp.Seek(0,2);

Temp.Write(Offset,4);

Temp.Free;

End;

Result:=True;

except

End;

End;

function TWIL.ReplaceBitMap(Index:Integer;NewBitMap:TBitMap):Boolean;

var

Width,Height,x,y:smallint;

Temp:TMemoryStream;

offset,size,i,WixFileHandle:Integer;

DBits:PByte; {lsDib: TDib; 这个是一个类,但是用之前不是要先构造吗?

是的,在WIL.CREATE中构造了。}

Begin

Result:=False;

try {这是什么奇怪的运算?}

lsDib.Width := (((NewBitMap.Width*8)+31) shr 5) * 4;

lsDib.Height := NewBitMap.Height;

lsDib.ColorTable := MainPalette; {在TWIL.LoadPalette;中读取了WIL 文件的}

lsDib.UpdatePalette;

lsdib.Canvas.Brush.Color:=clblack; {刷黑背景?}

lsDib.Canvas.FillRect(Rect(0,0,lsdib.Width,lsdib.Height));

lsDib.Canvas.Draw(0,0,NewBitmap);

if Stream<>nil then

Begin

OffSet:=(indexlist[index]); {这里OFFSET 表示图片的位置。偏移}

Stream.Seek(Offset,0);

Stream.Read(Width,2); {直接读取了,没有用到记录类型了。}

Stream.Read(Height,2);

Stream.Read(x,2);

Stream.Read(y,2);

DBits:=lsDIb.PBits; {这里是要求替换的图片长宽是相同的}

if(Width=lsDib.Width) and(Height=lsDib.Height) then

Begin

Stream.Write(DBits^,lsDib.Width*lsDib.Height);

End

else

Begin {替换的图片长宽是不相同的,开始}

{下一图片的位置?(OFFSET+ 8 +width*height) }

Size:=Stream.Size-offset-8-Width*Height;

Temp:=TMemoryStream.Create;

Stream.Seek(0,0);

Temp.LoadFromStream(stream); {整个拷贝在TEMP中备份}

Stream.Seek(offset,0); {流指针到本图片的位置}

x:=lsDib.Width;

y:=lsDib.Height;

Stream.Write(x,2);

Stream.Write(y,2); {写入图片宽长}

Stream.Seek(4,1); {流指针移动4字节,这里是XY偏移的记录地方,}

Stream.Write(Dbits^,x*y); {写入图片数据}

Temp.Seek(offset+8+Width*Height,0); {备份流移动到原图片末尾位置}

Stream.CopyFrom(Temp,size); {接续回来}

Temp.Free;

WixFileHandle:=FileOpen(idxfile,fmOpenReadWrite); {打开索引文件}

FileSeek(WixFileHandle,48+4*(Index+1),0); {48,头文件字节数}

for i:=Index+1 to ImageCount-1 do

Begin {WIdth*Height,原图片的长宽,X,Y 现在图片的长宽}

OffSet:=(indexlist[i])+ x*y -WIdth*Height;

IndexList[i]:=Offset;

FileWrite(WixFileHandle,offset,4);

End;

FileClose(WixFIleHandle);

LoadIndex(idxfile); //重新加载 IDX 文件。

End;

Result:=True;

End;

Finally

End;

End;

procedure TWil.DrawZoomEx (paper: TCanvas; Rec:TRect; index: integer; leftzero: Boolean);

var

rc: TRect;

bmp,bmp2: TBitmap;

begin

if LibType <> ltLoadBmp then exit;

//if index > BmpList.Count-1 then exit;

bmp := Bitmaps[index]; //这个是直接赋值句柄吗???所以一FREE就崩溃了

if bmp <> nil then

begin

Bmp2 := TBitmap.Create;

Bmp2.Width :=Rec.Right-Rec.Left; //方格宽度

Bmp2.Height :=Rec.Bottom-Rec.Top; // 方格高度

if Bmp2.Width > Bmp.Width then bmp2.Width:=bmp.Width;

if bmp2.Height > bmp.Height then bmp2.Height:=bmp.Height;

{缩小图片到REC 的大小}

rc := Rect(0, 0, Bmp2.Width, Bmp2.Height);

Bmp2.Canvas.StretchDraw (rc, Bmp);

paper.CopyRect(Rec, bmp2.Canvas, rc);

{靠左显示,但看代码是靠上,或者靠下显示?}

{ if leftzero then

begin

SpliteBitmap (paper.Handle, Rec.Left,rec.Top, Bmp2, $0)

end

else

begin

SpliteBitmap (paper.Handle, Rec.Left, rec.Top-Bmp2.Height, Bmp2, $0);

end; }

bmp2.Free;

// bmp.Free;

end;

end;

{缩放绘画}

procedure TWil.DrawZoom (paper: TCanvas; x,y, index: integer; zoom:Real;Tran,leftzero: Boolean);

var

rc: TRect;

bmp, bmp2: TBitmap;

begin

if LibType <> ltLoadBmp then exit;

//if index > BmpList.Count-1 then exit;

bmp := Bitmaps[index]; {可以直接赋值吗,这个BMP还没有建立? }

x:=x; {这个又是什么?}

y:=y;

if bmp <> nil then

begin

Bmp2 := TBitmap.Create;

Bmp2.Width := Round (Bmp.Width * zoom); {缩放取整 }

Bmp2.Height := Round (Bmp.Height * zoom);

rc.Left := x; { 图片起点}

rc.Top := y;

rc.Right := x + Round (bmp.Width * zoom); {图片终点}

rc.Bottom := y + Round (bmp.Height * zoom);

paper.DrawFocusRect(rc); {canvas 里面的方法?

画一个矩形框表示矩形内的控件对象具有输入焦点。}

if (rc.Right > rc.Left) and (rc.Bottom > rc.Top) then

begin

Bmp2.Canvas.StretchDraw (Rect(0, 0, Bmp2.Width, Bmp2.Height), Bmp);

if leftzero then

begin

if Tran then {还是调用了SpliteBitmap}

SpliteBitmap (paper.Handle, X, Y, Bmp2, $0)

else

SpliteBitmap (paper.Handle, X, Y, Bmp2, $FF);

end

else

begin

if Tran then

SpliteBitmap (paper.Handle, X, Y, Bmp2, $0)

else

SpliteBitmap (paper.Handle, X, Y, Bmp2, $FF);

end;

end;

bmp2.Free;

end;

end;

procedure TWil.Tran(value:Integer);

var

i:integer;

Begin

if Value=-1 then

LoadPalette

else

Begin

for i:=0 to 255 do

Begin

if (MainPalette[i].rgbBlue

Begin

// if (abs(MainPalette[i].rgbBlue-MainPalette[i].rgbGreen)<(Value-2)) and (abs(MainPalette[i].rgbBlue-MainPalette[i].rgbRed)<(Value-2)) and (abs(MainPalette[i].rgbRed-MainPalette[i].rgbGreen)<(Value-2)) then

Begin

MainPalette[i].rgbBlue:=0;

MainPalette[i].rgbGreen:=0;

MainPalette[i].rgbRed:=0;

end;

End;

End;

End;

End;

function TWil.Changex(index:Integer;x:Smallint):Boolean;

var

size:integer;

Begin

Result:=True;

if Stream<>nil then

Begin

size:=IndexList[index];

Stream.Seek(Size+4,0);

Stream.Write(x,2);

End;

End;

function TWil.Changey(index:Integer;y:Smallint):Boolean;

var

size:integer;

Begin

Result:=True;

if Stream<>nil then

Begin

size:=IndexList[index];

Stream.Seek(Size+6,0);

Stream.Write(y,2);

End;

End;

end.

做的笔记

Wil 文件区分,但读取的都是MIR2 数据格式(1)从1.5 1.76 1.8,到SF 所以只考虑FType:=0 Offset = 0这种情况了。Title='ILIB v1.0-WEMADE Entertainment inc. FType:=0 Offset = 0 MIR2 数据格式(1)Title='WEMADE Entertainment inc.' FType:=1 Offset = 4 MIR2 数据格式(2)ILIB v1.0-WEMADE FType:=2 OffSet = 0 EI3 数据格式(1) OffSet <> 0 EI3 数据格式(2)FType = 0 FOffset = 0 IDX 文件 TWMIndexHeader 后(48,0)即是IndexList

FType = 1 FOffset = 4 IDX 文件 TWMIndexHeader,(52,0)后是IndexList (但如果读取IndexList[0]<>1084,则Ftype:=0 FoffSet:=0)

FType = 2 FOffset = 变化按照NewHeaderofIndex 后(24,0) 读取到IndexList如果IndexList[0]<0 ,24 后4字节移动Inc(Foffset) 直到IndexList[0]>= 0

FOffset4 size:=60 MainPalette

其它值,0 size:=56 MainPalette

=================================================================WIL 的用法:构造,CREATE对其属性 FILENAME 赋值,对应的文件名,Initilaize

调用方法,读写属性 Finalizefree

Mywil单元定义了一些记录类型用于 WIL文件的文件头,文件信息TWMImageHeaderTWMImageInfo用于WIX 文件TWMIndexHeaderTWMIndexInfo

还有其它版本的WIL ,WIX 文件格式,这个用了Packed 我看这个倒是像是原版的。TNewWilHeaderTNewWilImageInfoTNewWixHeader

一个 TLibType 的枚举

一个 WIL 的类,继承于TComponent里面是定义的成员数据,成员方法 还有属性,根据需要分到 不同的封装,有仅在本单元内使用的私有,保护,成员可以其它单元使用的公开,发布 成员。

==========================================================主要成员数据,方法,属性==========================================================

Wil.StreamWil.Bitmaps[Index]Wil.Bitmaps[BmpIndex].SaveToFile(FileName) 这个用来导出图片Wil.Bitmaps[BmpIndex].WidthWil.Bitmaps[BmpIndex].HeightlsDib: TDib; 一个DIB 的类。Wil.ImageCountWil.FileNameWil.WidthWil.HeightWil.pxWil.pyWil.FileTypeWil.OffSetconstructor Create (AOwner: TComponent); override构造函数destructor Destroy; override 析构函数

Wil.Initialize 读入一个WIL 文件,对有关属性写入Wil.Finalize

Wil.DrawZoom(pbShow.Canvas, BmpX, BmpY, BmpIndex, BmpZoom, BmpTransparent,False)在PAINTBOX 中也就是主图显示中用到Wil.DrawZoomEx(DrawGrid1.Canvas, Rect, Index, True)在DRAWGRIDDRAWCELL 中用到Wil.ReplaceBitMap(BmpIndex, Bitmap) 替换图片,procedure SpliteBitmap (DC: HDC; X, Y: integer; bitmap: TBitmap; transcolor: TColor);;贴图,被Wil.DrawZoom,Wil.DrawZoomEx调用function TWIL.AddNUllBitmap:Boolean; WIL 末尾添加空图片procedure TWIL.LoadPalette; 读取调色板,放到MainPalette 在Wil.Initialize中被调用procedure TWil.Tran(value:Integer) 转换调色板?这个没有用上。procedure TWIL.LoadIndex (idxfile: string); 读取 IDX 文件内容到 IndexList数组,procedure FillBitMapHeader(var BitMap:TBitMapHeader); BMP 头文件,在procedure TWIL.LoadNewBmpImage 中被调用。

================================================需要的 构造函数 constructor Create (AOwner: TComponent); override; 析构函数 destructor Destroy; override;

构造函数 先调用了父类的 构造函数 inherited Create (AOwner);

对一些变量进行的赋值建立了一个DIB 的对象实例建立一个BITMAP 的对象实例FBitMap

析构函数 Free了 stream,dib的实例后调用父类的析构函数 没有free BITMAP 的对象实例?

1. Initialize方法对WIL 文件 建立 流stream 读取 相应位置的数据到 记录变量中进行文件版本判断。

调用LoadIndex 函数 对WIX 文件进行操作,这里没有建立流,而是采用的 FileOpen ,FileRead 的函数。读文件头区别不同版本,根据不同版本的WIX 文件有些区别操作,将为文件信息读取到 IndexList 这个数组中。

导入 Paleete调色板 LoadPalette;

区分不同版本的WIL, 调色板的位置不同 60,56 位置读取wil 的调色板部分,写入MainPalette内操作后 赋值给FBitMap,在构造函数中建立的FBitMap,一个BITMAP对象?

创建调色板 这里需要学习创建调色板。。。。

2. Finalize释放stream,调用FreeBitMap 释放 BITMAP? FreeBitmap 是个空函数IndexList 数组设置长度为0 ,FOffset, FType 设置为0,

==================================================================property Bitmaps[Index: Integer]: TBitmap read FGetImageBitmap;==================================================================属性数组? 有下标,但是没有数组大小,是个动态数组?读取function TWIL.FGetImageBitmap (index: integer): TBitmap;里面又调用 function GetCachedBitmap (index: integer): TBitmap;

==================================================================function GetCachedBitmap (index: integer): TBitmap;==================================================================这个是属性BITMPA 的读方法编号越界返回空图片,INDEX 判断范围 0< INDEX< = IMAGECOUNT

WIL文件版本判断 0,1版本调用 LoadBmpImage (position,index)。用来提取图片赋值 PX,PY .

读取的indexlist数组 ,取得 position,这个在indexlist 在initializ 已经填值好了。调用 0,1版本的 WIL 文件,

调用procedure TWIL.LoadBmpImage (position: integer; index:integer);

其它版本调用 LoadNewBmpImage (position,index)这个不用考虑了,应该是其它版本的WIL 文件,很少见到?

==================================================================procedure TWIL.LoadBmpImage (position: integer; index:integer);==================================================================读取WIL 文件,position位置的TWMImageInfo读取 图片的宽,高,偏移量X,Y根据图片的宽高读取 字节 到 DIB 中,

将DIB 绘制到 BITMAP中去。

返回一个 FBitMap给FWidthFHeight 赋值

===============================================================================procedure TWil.DrawZoomEx (paper: TCanvas; Rec:TRect; index: integer; leftzero: Boolean);===============================================================================

调用 SpliteBitmap

===============================================================================procedure TWil.DrawZoom (paper: TCanvas; x,y, index: integer; zoom:Real;Tran,leftzero: Boolean);===============================================================================

===============================================================================procedure SpliteBitmap (DC: HDC; X, Y: integer; bitmap: TBitmap; transcolor: TColor);===============================================================================调用hbmCopy := DuplicateBitmap (bitmap)一个BMP复制功能hdcCopy hdcForeMask SRCCOPYhdcForeMask hdcBackMask NOTSRCCOPY DC hdcMixBuffer SRCCOPYhdcForeMask hdcMixBuffer SRCANDhdcBackMask hdcCopy SRCAND hdcCopy hdcMixBuffer SRCPAINThdcMixBuffer DC

SPRITE零件贴图透明色逻辑运算 有效 图样黑色透明色 背景 先AND 去除用模板 得到中间图 中间图 OR 图样 图样白色透明色 背景 先OR 去除用模板 得到中间图 中间图 AND 图样

去除用模板 制作图样白色透明色 去除模板透明色为黑色,其余为白色

LOADBMP 载入点阵图(图样)XPATBMP 去除模板点阵图(去除模板)1。将LOADBMP 复制 XPATBMP 这一步可以省掉设置RECTL XPATBMP.CANVAS.COPYMODE := CMSRCCOPY 将复制点阵图复制起来(默认值)XPATBMP.CANVAS.COPYRECT(RECTL,LOADBMP.CANVAS,RECTL)

2。LOADBMP白色部分转换成黑色,复制到XPATBMAP XPATBMP.CANVAS.BRUSH.COLOR := CLBLACK; XPATBMP.CANVAS.BRUSHCOPY(RECTL,LOADBMP,RECTL,CLWHITE);

3。对LOADBAMP进行色彩反转后,以 OR 合成至 XPATBMAPXPATBMP.CANVAS.COPYMODE := CMMEGERPAIN 将复制的源点阵图做反白处理后,再将其与复制目的点阵图依位单位以OR 方式合成XPATBMAP.CANVAS.COPYRECT(RECTL,LOADBMP.CANVAS,RECTL)

MAKEBMP 制作用点阵图MAKEBMP 载入背景RECTM, RECTL

背景 先OR 去除用模板 MAKEBMP.CANVAS.COPYMODE := CMSRCPAINT 将复制源点阵图与复制目的点阵图按位单位将每个像素以 OR 方式合成MAKEBMP.CANVAS.COPYRECT(RECTM,XPATBMAP.RECTL)

中间图 AND 图样MAKEBMP.CANVAS.COPYMODE := CMSRCAND 将复制源点阵图与复制目的点阵图按位单位将每个像素以 AND 方式合成MAKEBMP.CANVAS.COPYRECT(RECTM,CANVAS.RECTL)

==============================传奇 图样黑色透明色 去除模板透明色为白,其余为黑色

1。将LOADBMP 复制 XPATBMP 这一步可以省掉设置RECTL XPATBMP.CANVAS.COPYMODE := CMSRCCOPY 将复制点阵图复制起来(默认值)XPATBMP.CANVAS.COPYRECT(RECTL,LOADBMP.CANVAS,RECTL)

2。LOADBMP黑色部分转换成白色,复制到XPATBMAP XPATBMP.CANVAS.BRUSH.COLOR := clwhite; XPATBMP.CANVAS.BRUSHCOPY(RECTL,LOADBMP,RECTL,CLblack);

3。 将复制的源点阵图与复制目的点阵图按位单位将每个像素以XOR 方式合成

XPATBMP.CANVAS.COPYMODE := cm srcinvert 将复制的源点阵图与复制目的点阵图按位单位将每个像素以XOR 方式合成XPATBMAP.CANVAS.COPYRECT(RECTL,LOADBMP.CANVAS,RECTL)

图样黑色透明色 背景 先AND 去除用模板 得到中间图 中间图 OR 图样

================================================================================== Wil.ReplaceBitMap(BmpIndex, Bitmap); 替换图片,替换空图片来达到删除图片的目的==================================================================================== function TWIL.ReplaceBitMap(Index:Integer;NewBitMap:TBitMap):Boolean;

BMP文件需要转换成DIB格式,根据BMP文件设置IDB 图片长宽加载DIB 文件的 主调色板,刷黑DIB 文件背景,拷贝入 BMP 文件

读取原文件大小, 长宽相同直接替代

长宽不同,备份流文件,写入图片,接续后备份流文件后续,

改写 IEX 文件。重新加载 IDX 文件。

================================================================function TWIL.AddBitmap(NewBitMap:TBitMap;X,Y:SmallInt):Boolean;================================================================wil 文件尾添加图片

判断空图片则调用function TWIL.AddNUllBitmap:Boolean;

这只DIB 数据,将BMP 拷贝入DIB ,

写入STREAM 44 IMAGECOUNT保存STEAM.SIZE 到OFFSET文件末尾 写入WIDTH, HEIGHT,偏移X,Y ,DIB.PBITS,

打开IDX文件, 44 位置写入 FIMAGECOUNT, 尾端 写入OFFSET 值。

================================================================function TWil.Changex(index:Integer;x:Smallint):Boolean;================================================================读取 INDEXLIST[] 到 SIZESTREAM SIZE + 4 写入X

================================================================function TWil.Changey(index:Integer;y:Smallint):Boolean;================================================================读取 INDEXLIST[] 到 SIZESTREAM SIZE + 6 写入Y

============================================================function TWIL.AddNUllBitmap:Boolean;============================================================WIL 末尾添加空图片。INC FIMAGECOUNTWIL流指针移动到44, 写入FIMAGECOUNT的值,记下WIL 流字节数(添加空图片的开始位置)写入空图片数据,记录格式

打开 IDX 文件,44位置写入 FIMAGECOUNT文件尾写入WIL 流字节数(添加空图片的开始位置)释放IDX文件。

问题1,这个是什么??lsDib.Width := (((NewBitMap.Width*8)+31) shr 5) * 4; 实验的数据: 得到最近4的倍数,方便存放4字节?

2, 调色板是什么?procedure TWIL.LoadPalette;

在TWIL.AddBitmap TWIL.ReplaceBitMap TWIL.LoadBmpImag中会将lsDib.ColorTable := MainPalette;给DIB 类, ColorTable: TRGBQuads;

在WIL 文件的56位置,读取Stream.Read (MainPalette, sizeof(TRgbQuad) * 256) MainPalette: TRgbQuads;TRGBQuads = array[0..255] of TRGBQuadTRGBQuad 系统定义

3,TDib.Create文件的建立?

4,TBitMapHeader头文件?用在少见版的WIL 中

相关数据

聒噪的意思

聒噪的意思

zào shēng 噪声 常用zào yīn 噪音 常用gǔ zào 鼓噪 常用míng zào yī shí 名噪一时 常用xù guō 絮聒 常用xuān zào 喧噪 常用guō ěr 聒耳 常用guō chăo

09-07 天天365彩票软件官方下载3D
袜子也是时尚配件!日本必逛的5间连锁袜子专卖店

袜子也是时尚配件!日本必逛的5间连锁袜子专卖店

日本人非常善于利用配件来替整体印象加分,其中最让外国人感到惊奇的就是日本女生的「袜子」!在日本的百货商场内通常会见到袜子专卖店

09-01 天天365彩票软件官方下载3D
苏州中国电信网点分布

苏州中国电信网点分布

中国电信集团公司(简称“中国电信”)成立于2000年5月17日,是我国特大型国有通信企业。中国电信作为中国主体电信企业和最大的基础网络运

08-03 天天365彩票软件官方下载3D
中国到底多少人用手机?工信部表示:人均超一部,覆盖率惊人

中国到底多少人用手机?工信部表示:人均超一部,覆盖率惊人

目前人均一部手机基本上是常见的情况了,即使是小孩,也有可通话的智能手表。而我国作为人口大国,又是全球第一智能手机市场,在手机数

08-20 mobile3656
7个生肖复式5肖多少组 生肖复式表格图片大全是什么意思?

7个生肖复式5肖多少组 生肖复式表格图片大全是什么意思?

六个复式五个等于多少个720个。 6肖复式5肖,即从6个数中取5个数有多少组。 如果不考虑排列顺序有C^5(6)=6x5x4x3x2/5x4x3x2x1=6组。 如果考虑排列顺

08-16 mobile3656
以下哪个不是铁鼠技能 网易阴阳师密信答案

以下哪个不是铁鼠技能 网易阴阳师密信答案

这个问题是阴阳师逢魔之时的迷信问题,三个选项当中我们选择“家财万贯”这个选项即可。 问题: 以下哪个不是铁鼠的技能? 选项: 1、钱

09-08 电视直播网365