|
|
2015/10/12(Mon) 12:15:04|NO.72232
今、画像ビューアーみたいなものを作っていますが、ddsファイルを読み込むモジュールが見つかりません。
どなたか、読み込む方法、モジュールなど知りませんか?
|
|
2015/10/12(Mon) 12:39:32|NO.72233
どうやらdirectx独自フォーマットのようです。
hspdxで使えると思います。
|
|
2015/10/12(Mon) 13:00:56|NO.72235
どうやらhspdx自体に画像読み込み機能は無く、既に読み込んだ画像のコピーぐらいしかできない模様なのですが
|
|
2015/10/12(Mon) 13:37:35|NO.72238
|
|
2015/10/12(Mon) 14:45:15|NO.72241
うまくいかないので、自分なりに解決していきたいと思います。
ありがとうございます。
|
|
2015/10/12(Mon) 22:37:09|NO.72263
α値も反映させたい場合もう一工夫必要・・・
#module
#uselib "d3d9.dll"
#cfunc Direct3DCreate9 "Direct3DCreate9" int
#usecom IDirect3D9 "{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"
#comfunc IDirect3D9_CreateDevice 16 int,int,int,int,int,int
#uselib "d3dx9_36.dll"
#func D3DXLoadSurfaceFromFile "D3DXLoadSurfaceFromFileA" comobj,int,int,str,int,int,int,int
#func D3DXGetImageInfoFromFile "D3DXGetImageInfoFromFileA" sptr,var
#usecom IDirect3DDevice9 "{D0223B96-BF7A-43fd-92BD-A43B0D82B9EB}"
#comfunc IDirect3DDevice9_CreateOffscreenPlainSurface 36 int,int,int,int,int,int
#usecom IDirect3DSurface9 "{0CFBAF3A-9FF6-429a-99B3-A2796AF8B89B}"
#comfunc IDirect3DSurface9_GetDC 15 int
#comfunc IDirect3DSurface9_ReleaseDC 16 int
#uselib "gdi32.dll"
#func DeleteDC "DeleteDC" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
////画像ファイルをロード
//[ ImageLoad "filename",p1 ]
// "filename" : ロードするファイル名
// p1=0〜1(0) : 画像ロードモード
//戻り値:refstrにファイルのフォーマット名が半角大文字3文字で返る
//基本的に標準命令のpicloadと同じですがp1に1を指定してもα値含む透過処理はされません。
//読み込めるファイルフォーマットは.bmp、.dds、.dib、.jpg、.png、 .tga
#deffunc ImageLoad str fname,int opt
if vartype(g_pd3d) ! 6 {
def_selid=ginfo_sel
screen 100,1,1,2 //DirectXのウィンドウを作るのにID100を使用
ret = Direct3DCreate9(32) // D3D_SDK_VERSION 32
if( ret == 0 ) : dialog "error : Direct3DCreate9" : end
newcom g_pd3d, , -1, ret
dim d3dpp, 14
d3dpp(2) = 0 // BackBufferFormat = D3DFMT_UNKNOWN
d3dpp(6) = 1 // SwapEffect = D3DSWAPEFFECT_DISCARD
d3dpp(8) = 1 // Windowed = 1
d3dpp(9) = 1 // EnableAutoDepthStencil = 1
d3dpp(10) = 80 // AutoDepthStencilFormat = D3DFMT_D16
d3dpp(13) = 0x80000000 // PresentationInterval
// D3DDEVTYPE_HAL 1 D3DCREATE_SOFTWARE_VERTEXPROCESSING 0x20
IDirect3D9_CreateDevice g_pd3d, 0, 1, hwnd, 0x20, varptr(d3dpp), varptr(ret)
if stat : dialog "error : IDirect3D9_CreateDevice\n"+stat : end
newcom g_pd3dDev, , -1, ret
gsel def_selid
dim SrcInfo,7
D3DXIMAGE_FILEFORMAT@= "BMP","JPG","TGA","PNG","DDS","PPM","DIB","HDR","PFM"
}
D3DXGetImageInfoFromFile fname,SrcInfo
if stat : dialog "error : D3DXGetImageInfoFromFile\n"+stat : end
IDirect3DDevice9_CreateOffscreenPlainSurface g_pd3dDev,SrcInfo,SrcInfo(1),21,2, varptr(pTexture),0//D3DFMT_A8R8G8B8
if stat : dialog "error : IDirect3DDevice9_CreateOffscreenPlainSurface\n"+stat : end
newcom Surface, , -1, pTexture
D3DXLoadSurfaceFromFile Surface,0,0,fname,0,1,0,0
if stat : dialog "error : D3DXLoadSurfaceFromFile\n"+stat : end
IDirect3DSurface9_GetDC Surface,varptr(phdcSurface)
if stat : dialog "error : IDirect3DSurface9_GetDC\n"+stat : end
mref bmscr,67
if (opt&1)=0 {
if bmscr(17)=1 {
buffer ginfo_sel,SrcInfo,SrcInfo(1)
BitBlt hdc,0,0,SrcInfo,SrcInfo(1),phdcSurface,0,0,0x00CC0020 //SRCCOPY
}else{
screen ginfo_sel,SrcInfo,SrcInfo(1)
BitBlt hdc,0,0,SrcInfo,SrcInfo(1),phdcSurface,0,0,0x00CC0020 //SRCCOPY
redraw
}
}else{
if opt>2 {color:boxf}
BitBlt hdc,ginfo_cx,ginfo_cy,SrcInfo,SrcInfo(1),phdcSurface,0,0,0x00CC0020 //SRCCOPY
if bmscr(19)=65537 {redraw}
}
IDirect3DSurface9_ReleaseDC Surface,phdcSurface
if stat : dialog "error : IDirect3DSurface9_ReleaseDC\n"+stat : end
delcom Surface//Surface削除
Surface=0
return D3DXIMAGE_FILEFORMAT@(SrcInfo(6))
////イメージ ファイルのオリジナルの内容の記述を返す。
//[ 変数 = getImageInfo(index) ]
// index : 0〜6(下記参照)
//
// 0=Width オリジナル イメージの幅 (ピクセル単位)。
// 1=Height オリジナル イメージの高さ (ピクセル単位)。
// 2=Depth オリジナル イメージの深度 (ピクセル単位)。
// 3=MipLevels オリジナル イメージのミップ レベルの数。
// 4=Format オリジナル イメージのデータを最も厳密に記述する D3DFORMAT 列挙型からの値。
// 5=ResourceType ファイルに格納されているテクスチャのタイプを表す。D3DRTYPE_TEXTURE、D3DRTYPE_VOLUMETEXTURE、または D3DRTYPE_CUBETEXTURE。
// 6=ImageFileFormat イメージ ファイルのフォーマットを表す。
#defcfunc getImageInfo int index
return SrcInfo(index)
//終了処理
#deffunc dx9_Exit onexit
if vartype(Surface) = 6 : delcom Surface:Surface=0
if vartype(g_pd3dDev) = 6 : delcom g_pd3dDev:g_pd3dDev=0
if vartype(g_pd3d) = 6 : delcom g_pd3d:g_pd3d=0
return
#global
ImageLoad dir_exe+"\\sample\\hgimg4\\res\\sky.dds"
title "ImageFileFormat : "+refstr
font "MS ゴシック",24,16
color
infname="Width","Height","Depth","MipLevels","Format","ResourceType","ImageFileFormat"
repeat 7
mes infname(cnt)+" : "+getImageInfo(cnt)
loop
| |
|
2015/10/12(Mon) 22:49:02|NO.72265
書き忘れ
d3dx9_36.dllを使用してるのでOSインストール後に
一回はDirectXを更新してないと実行できません。
|
|
2015/10/14(Wed) 00:49:50|NO.72289
オプションに2を指定したときの動作が違ってたのを修正
α値に対応してgmode7用にbuffer IMAGELOAD_BUFID内に加工
但しファイルフォーマットがD3DFMT_A8R8G8B8)と32(D3DFMT_A8B8G8R8)場合のみ
#module
#uselib "d3d9.dll"
#cfunc Direct3DCreate9 "Direct3DCreate9" int
#usecom IDirect3D9 "{81BDCBCA-64D4-426d-AE8D-AD0147F4275C}"
#comfunc IDirect3D9_CreateDevice 16 int,int,int,int,int,int
#uselib "d3dx9_36.dll"
#func D3DXLoadSurfaceFromFile "D3DXLoadSurfaceFromFileA" comobj,int,int,str,int,int,int,int
#func D3DXGetImageInfoFromFile "D3DXGetImageInfoFromFileA" sptr,var
#usecom IDirect3DDevice9 "{D0223B96-BF7A-43fd-92BD-A43B0D82B9EB}"
#comfunc IDirect3DDevice9_CreateOffscreenPlainSurface 36 int,int,int,int,int,int
#usecom IDirect3DSurface9 "{0CFBAF3A-9FF6-429a-99B3-A2796AF8B89B}"
#comfunc IDirect3DSurface9_GetContainer 11 int,int
#comfunc IDirect3DSurface9_LockRect 13 int,int,int
#comfunc IDirect3DSurface9_UnlockRect 14
#comfunc IDirect3DSurface9_GetDC 15 int
#comfunc IDirect3DSurface9_ReleaseDC 16 int
#uselib "gdi32.dll"
#func DeleteDC "DeleteDC" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#cfunc SetDIBitsToDevice "SetDIBitsToDevice" int,int,int,int,int,int,int,int,int,int,var,int
#define global DIRECTX_WINID 100
#define global IMAGELOAD_BUFID 101
////画像ファイルをロード
//[ ImageLoad "filename",p1 ]
// "filename" : ロードするファイル名
// p1=0〜1(0) : 画像ロードモード
//戻り値1:statにD3DFMTが返る21(D3DFMT_A8R8G8B8)と32(D3DFMT_A8B8G8R8)の場合IMAGELOAD_BUFIDのbufferにmoude7用のデータ形式で読み込まれる
//戻り値2:refstrにファイルのフォーマット名が半角大文字3文字で返る
//基本的に標準命令のpicloadと同じなので詳しくはpicloadのヘルプを参照
//読み込めるファイルフォーマットは.bmp、.dds、.dib、.jpg、.png、 .tga
#deffunc ImageLoad str fname,int opt
def_selid=ginfo_sel
if vartype(g_pd3d) ! 6 {
screen DIRECTX_WINID@,1,1,2 //DirectXのウィンドウを作るのにDIRECTX_WINIDを使用
ret = Direct3DCreate9(32) // D3D_SDK_VERSION 32
if( ret == 0 ) : dialog "error : Direct3DCreate9" : end
newcom g_pd3d, , -1, ret
dim d3dpp, 14
d3dpp(2) = 0 // BackBufferFormat = D3DFMT_UNKNOWN
d3dpp(6) = 1 // SwapEffect = D3DSWAPEFFECT_DISCARD
d3dpp(8) = 1 // Windowed = 1
d3dpp(9) = 1 // EnableAutoDepthStencil = 1
d3dpp(10) = 80 // AutoDepthStencilFormat = D3DFMT_D16
d3dpp(13) = 0x80000000 // PresentationInterval
// D3DDEVTYPE_HAL 1 D3DCREATE_SOFTWARE_VERTEXPROCESSING 0x20
IDirect3D9_CreateDevice g_pd3d, 0, 1, hwnd, 0x20, varptr(d3dpp), varptr(ret)
if stat : dialog "error : IDirect3D9_CreateDevice\n"+stat : end
newcom g_pd3dDev, , -1, ret
gsel def_selid
dim SrcInfo,7
dim D3DLOCKED_RECT8,2
D3DXIMAGE_FILEFORMAT@= "BMP","JPG","TGA","PNG","DDS","PPM","DIB","HDR","PFM"
}
D3DXGetImageInfoFromFile fname,SrcInfo
if stat : dialog "error : D3DXGetImageInfoFromFile\n"+stat : end
IDirect3DDevice9_CreateOffscreenPlainSurface g_pd3dDev,SrcInfo,SrcInfo(1),21,2, varptr(pTexture),0//D3DFMT_A8R8G8B8
if stat : dialog "error : IDirect3DDevice9_CreateOffscreenPlainSurface\n"+stat : end
newcom Surface, , -1, pTexture
D3DXLoadSurfaceFromFile Surface,0,0,fname,0,1,0,0
if stat : dialog "error : D3DXLoadSurfaceFromFile\n"+stat : end
mref _stat,64
mref bmscr,67
if SrcInfo(4)=21 or SrcInfo(4)=32 {
dim LPBITMAPINFO,14
LPBITMAPINFO = 40 ,SrcInfo ,-SrcInfo(1) ,(32<<16) | 1,0x00000003,0;dup_tsizex*dup_tsizey*(bit/8) //上下反転した32ビットの色データとしてLPBITMAPINFOを設定
LPBITMAPINFO(10)=$ff000000,$ff000000,$ff000000
buffer IMAGELOAD_BUFID@,SrcInfo*2,SrcInfo(1)
IDirect3DSurface9_LockRect Surface,varptr(D3DLOCKED_RECT8), 0, 0x00000010|0x00008000
if stat : dialog "error : IDirect3DSurface9_LockRect\n"+stat : end
CopyLine = SetDIBitsToDevice(hdc, SrcInfo, 0, SrcInfo, SrcInfo(1), 0,0, 0, SrcInfo(1), D3DLOCKED_RECT8(1),LPBITMAPINFO, 0)
LPBITMAPINFO(10)=$ff0000,$ff00,$ff
CopyLine = SetDIBitsToDevice(hdc, 0, 0, SrcInfo, SrcInfo(1), 0,0, 0, SrcInfo(1), D3DLOCKED_RECT8(1),LPBITMAPINFO, 0)
IDirect3DSurface9_UnlockRect Surface
if stat : dialog "error : IDirect3DSurface9_UnlockRect\n"+stat : end
if (opt&1)=0 {
if bmscr(17)=1 {buffer def_selid,SrcInfo,SrcInfo(1)}else{
if bmscr(17)=3 {bgscr def_selid,SrcInfo,SrcInfo(1)}else{screen def_selid,SrcInfo,SrcInfo(1)}
}
if opt=2 {gmode_c=BMSCR(40):color:boxf:color (gmode_c&$ff0000)>>16,(gmode_c&$ff00)>>8,gmode_c&$ff}
gmode 7,SrcInfo,SrcInfo(1)
gcopy IMAGELOAD_BUFID@,0,0,SrcInfo,SrcInfo(1)
gmode 0,32,32,0
}else{
gsel def_selid
gmode_mxya=BMSCR(35),BMSCR(33),BMSCR(34),BMSCR(65)
gmode 7,SrcInfo,SrcInfo(1)
gcopy IMAGELOAD_BUFID@,0,0,SrcInfo,SrcInfo(1)
gmode gmode_mxya,gmode_mxya(1),gmode_mxya(2),gmode_mxya(3)
}
}else{
IDirect3DSurface9_GetDC Surface,varptr(phdcSurface)
if stat : dialog "error : IDirect3DSurface9_GetDC\n"+stat : end
if (opt&1)=0 {
if bmscr(17)=1 {
buffer def_selid,SrcInfo,SrcInfo(1)
BitBlt hdc,0,0,SrcInfo,SrcInfo(1),phdcSurface,0,0,0x00CC0020 //SRCCOPY
}else{
if bmscr(17)=3 {bgscr def_selid,SrcInfo,SrcInfo(1)}else{screen def_selid,SrcInfo,SrcInfo(1)}
BitBlt hdc,0,0,SrcInfo,SrcInfo(1),phdcSurface,0,0,0x00CC0020 //SRCCOPY
redraw
}
}else{
BitBlt hdc,ginfo_cx,ginfo_cy,SrcInfo,SrcInfo(1),phdcSurface,0,0,0x00CC0020 //SRCCOPY
if bmscr(19)=65537 {redraw}
}
IDirect3DSurface9_ReleaseDC Surface,phdcSurface
if stat : dialog "error : IDirect3DSurface9_ReleaseDC\n"+stat : end
}
delcom Surface//Surface削除
Surface=0
_stat=SrcInfo(4)
return D3DXIMAGE_FILEFORMAT@(SrcInfo(6))
////特定のイメージ ファイルに関する情報を取得します。
//[ ImageLoad fname,p_SrcInfo ]
// fname : ロードするファイル名
// p_SrcInfo : ソースファイル内のデータの記述を格納する配列(データ順はgetImageInfo()の下記参照)
#deffunc GetImageInfoFromFile str fname,array p_SrcInfo
dim p_SrcInfo,7
D3DXGetImageInfoFromFile fname,p_SrcInfo
return stat
////ImageLoad実行後にイメージ ファイルに関する情報を取得します。
//[ 変数 = getImageInfo(index) ]
// index : 0〜6(下記参照)
//
// 0=Width オリジナル イメージの幅 (ピクセル単位)。
// 1=Height オリジナル イメージの高さ (ピクセル単位)。
// 2=Depth オリジナル イメージの深度 (ピクセル単位)。
// 3=MipLevels オリジナル イメージのミップ レベルの数。
// 4=Format オリジナル イメージのデータを最も厳密に記述する D3DFORMAT 列挙型からの値。
// 5=ResourceType ファイルに格納されているテクスチャのタイプを表す。D3DRTYPE_TEXTURE、D3DRTYPE_VOLUMETEXTURE、または D3DRTYPE_CUBETEXTURE。
// 6=ImageFileFormat イメージ ファイルのフォーマットを表す。
#defcfunc getImageInfo int index
return SrcInfo(index)
//終了処理
#deffunc dx9_Exit onexit
if vartype(Surface) = 6 : delcom Surface:Surface=0
if vartype(g_pd3dDev) = 6 : delcom g_pd3dDev:g_pd3dDev=0
if vartype(g_pd3d) = 6 : delcom g_pd3d:g_pd3d=0
return
#global
xloop=ginfo_sx/8
yloop=ginfo_sy/8
repeat xloop*yloop
gradf ((cnt\xloop))*8,(cnt/xloop)*8,8,8,0,$444444^$222222*((cnt+((cnt/xloop)\2))\2),$444444^$222222*((cnt+((cnt/xloop)\2))\2)
loop
ImageLoad dir_exe+"\\hsptv\\hsptv_img.png",1
title "ImageFileFormat : "+refstr
if stat=21 or stat=32 {//21(D3DFMT_A8R8G8B8)と32(D3DFMT_A8B8G8R8)だったらIMAGELOAD_BUFIDの内容を見えるようにコピー
screen 10,getImageInfo(0)*2,getImageInfo(1),0,1000,0
gmode 0,getImageInfo(0)*2,getImageInfo(1)
gcopy IMAGELOAD_BUFID
}
font "MS ゴシック",24,16
color 255
infname="Width","Height","Depth","MipLevels","Format","ResourceType","ImageFileFormat"
repeat 7
mes infname(cnt)+" : "+getImageInfo(cnt)
loop
| |
|