// モニター画像をアイコンファイルにする // // grp_to_icon.imw3 // // デスクトップ画像を取り込み任意の位置(32×32)の絵をアイコンファイルにします // アイコンファイル形式はIMW3で使える形式です // // デスクトップ画像を取り込む GetGrp { wx = WIN_L ; wy = WIN_T ; // 現在のウィンドウ位置を記憶 SetWinPos(SCR_W,0,0) ; // ウィンドウをスクリーン外へ退避 x = ClientToScreenX(0) ; // ウィンドウから見たスクリーン座標を取得 y = ClientToScreenY(0) ; CopyBMP(0,-x,-y,SCR_W,SCR_H,1,0,0,SCR_W,SCR_H,0) ; // デスクトップ画像を裏画面に取得 SetWinPos(wx,wy,0) ; // ウィンドウを元の位置へ } DrawScreen { // ウィンドウの位置に合わせて画像も移動する x = ClientToScreenX(0) ; y = ClientToScreenY(0) ; CopyBMP(1,x,y+24,WIN_W,WIN_H, 0,0,24,WIN_W,WIN_H,0) ; Box(0,px-1,py-1,px+32+1,py+32+1,-2,-1) ; // 対象エリア Box(0,0,24,WIN_W,WIN_H,3,-1) ; } PAINT { // 初回だけ実行 if(init == 1){ call("GetGrp") ; init = 0 ; } call("DrawScreen") ; } // ウィンドウの移動 MOVE { call("DrawScreen") ; } INIT { // 対象エリア座標 px = WIN_W / 2 - 16 ; py = WIN_H / 2 - 16 ; error = 0 ; init = 1 ; } CREATE { SetWinSize(400,300) ; SetWinColor(16) ; SetCaption("モニター画像をアイコンへ") ; Data("hed",1,62) ; // ヘッダデータ Data("pal",256,3) ; // パレット色データ Data("icon",32,32) ; // アイコン画像データ Data("dat",1,2238) ; // ファイルデータ pal_start = 62 ; // パレットコード開始位置 ico_start = 1086 ; // アイコンデータ開始位置 x = 2 ; y = 2 ; w = 32 ; h = 18 ; CreateControl(0,"画像更新","ID_re",x,y,w*2,h) ; x = x + w * 3 ; CreateControl(0,"←","ID_l",x,y,w,h) ; x = x + w ; CreateControl(0,"↑","ID_u",x,y,w,h) ; x = x + w ; CreateControl(0,"↓","ID_d",x,y,w,h) ; x = x + w ; CreateControl(0,"→","ID_r",x,y,w,h) ; x = x + w * 2 ; CreateControl(0,"アイコン保存","ID_save",x,y,w*3,h) ; // 裏画面確保(念のため必要サイズの2倍) SubScreen(1,SCR_W*2,SCR_H*2) ; SubScreen(2,64,64) ; } // 画像更新 ID_re{ call("GetGrp") ; } // 矢印ボタン 対象枠を移動 ID_l{ px = px - 1 ; call("DrawScreen") ; } ID_r{ px = px + 1 ; call("DrawScreen") ; } ID_u{ py = py - 1 ; call("DrawScreen") ; } ID_d{ py = py + 1 ; call("DrawScreen") ; } // アイコン保存 ID_save { call("MakeSaveData") ; if(error > 0){ MessBox("色数が多すぎます","エラー",0,1) ; return ; } n = FileNameDlgW("名前を付けて保存","list",4) ; if(n < 1){ return ; } OpenFileWrite("FILE_NAME") ; n = 0 ; loop(2238){ WriteFile(n,dat(0,n)) ; n = n + 1 ; } CloseFile ; } // r g b 色からパレット番号を探す、無ければ追加する MakePalData { error = 0 ; p = 0 ; loop(255){ // 無い場合 if(p >= pal_many){ pal(p,0) = r ; pal(p,1) = g ; pal(p,2) = b ; data = p ; pal_many = pal_many + 1 ; return ; } // 同じ色の場合 if(pal(p,0) == r){ if(pal(p,1) == g){ if(pal(p,2) == b){ data = p ; return ; } } } p = p + 1 ; } error = 1 ; // 256色に収まらない } // アイコンファイルのデータを作成 MakeSaveData { // 裏画面2へ書込み CopyBMP(0,px,py,32,32,2,0,0,32,32,0) ; DataInit("dat",0) ; // 0で初期化 // ヘッダ部データセット dat(0, 2) = 1 ; dat(0, 4) = 1 ; dat(0, 6) = 32 ; dat(0, 7) = 32 ; dat(0,12) = 8 ; dat(0,14) = 168 ; dat(0,15) = 8 ; dat(0,18) = 22 ; dat(0,22) = 40 ; dat(0,26) = 32 ; dat(0,30) = 64 ; dat(0,34) = 1 ; dat(0,36) = 8 ; dat(0,43) = 4 ; dat(0,55) = 1 ; dat(0,59) = 1 ; // アイコン・パレット データ作成 DataInit("pal",255) ; // パレット白で初期化 pal(255,0) = 0 ; pal(255,1) = 0 ; pal(255,2) = 0 ; // 透明色パレット x = 0 ; y = 0 ; pal_many = 0 ; loop(32){ loop(32){ r = GetPixelR(2,x,y) ; g = GetPixelG(2,x,y) ; b = GetPixelB(2,x,y) ; call("MakePalData") ; // 色からパレット番号を探す if(error > 0){ return ; } icon(x,y) = data ; // パレット番号をセット x = x + 1 ; } x = 0 ; y = y + 1 ; } // パレットデータセット n = 0 ; pos = 62 ; loop(256){ dat(0,pos) = pal(n,2) ; dat(0,pos+1) = pal(n,1) ; dat(0,pos+2) = pal(n,0) ; pos = pos + 4 ; n = n + 1 ; } // アイコンデータセット y = 31 ; loop(32){ x = 0 ; loop(32){ dat(0,pos) = icon(x,y) ; pos = pos + 1 ; x = x + 1 ; } y = y - 1 ; } }