home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
fb386
/
32k2pxx
/
32k2pxx.bas
next >
Wrap
BASIC Source File
|
1980-01-02
|
22KB
|
674 lines
1000 '
1010 ' *** 安易3万色画像コンバートプログラム v1.2 ***
1020 ' (tif→pXXファイル)
1030 '
1040 ' By Pumpkin
1050 '
1060 '
1070 CLS:SCREEN @1:WINDOW(0,0)-(511,255):VIEW(0,0)-(511,255)
1080 PRINT "*** 安易3万色画像コンバートプログラム v1.2 ***"
1090 CLEAR ,,,&HC0000,8192:DEFINT A-Z:RANDOMIZE TIME
1100 DIM BUF(512*1024/2-1)
1110 LOADM"32k2pxx.rex",0
1120 CAL0&=13:CAL1&=15:CAL2&=17:CAL3&=19:CAL4&=24
1130 CAL5&=29:CAL6&=34
1140 '
1150 PRINT
1160 PRINT "1)32K色→256色 その1 FAST"
1170 PRINT "2)32K色→256色 その2 SLOW"
1180 PRINT "3)32K色→256色パレット固定(カラー)"
1190 PRINT "4)32K色→モノクロ256階調"
1200 PRINT "5)32K色→モノクロ16階調(疑似32階調)"
1210 PRINT "6)32K色→モノクロ16階調(疑似48階調)"
1220 PRINT "7)32K色→8色パレット固定(カラー)"
1230 PRINT "8)32K色→モノクロ単色"
1240 A$=INPUT$(1):IF A$>"8" OR A$<"1" THEN *BYE
1250 '
1260 LINE INPUT "入力ファイル名 =",FIN$ :IF LEN(FIN$ )<5 THEN *BYE
1270 LINE INPUT "出力ファイル名 =",FOUT$:IF LEN(FOUT$)<5 THEN *BYE
1280 LINE INPUT"センタリング処理をする(y/n)",KY$
1290 IF KY$="Y" OR KY$="y" THEN C_F=-1 ELSE C_F=0
1300 IF A$<"3" THEN X_F=-1:GOTO 1340
1310 LINE INPUT"2倍拡大表示をする(y/n)",KY$
1320 IF KY$="Y" OR KY$="y" THEN X_F=0 ELSE X_F=-1
1330 '
1340 IF A$="1" THEN O_F=2:GOSUB 1430:A_F=1:GOSUB *CLCV:GOTO *BYE
1350 IF A$="2" THEN O_F=2:GOSUB 1430:A_F=2:GOSUB *CLCV:GOTO *BYE
1360 IF A$="3" THEN O_F=1:GOSUB 1430:GOSUB *CL256 :GOTO *BYE
1370 IF A$="4" THEN O_F=2:GOSUB 1430:GOSUB *MN256 :GOTO *BYE
1380 IF A$="5" THEN O_F=2:GOSUB 1430:GOSUB *MN16_32:GOTO *BYE
1390 IF A$="6" THEN O_F=2:GOSUB 1430:GOSUB *MN16_48:GOTO *BYE
1400 IF A$="7" THEN O_F=1:GOSUB 1430:GOSUB *CL8 :GOTO *BYE
1410 IF A$="8" THEN O_F=3:GOSUB 1430:GOSUB *MN1 :GOTO *BYE
1420 '
1430 IF RIGHT$(FOUT$,4)<>".tif" AND RIGHT$(FOUT$,4)<>".TIF" THEN O_F = 4
1440 RETURN
1450 '
1460 *BYE
1470 END
1480 '
1490 '
1500 '*** 256色化
1510 '
1520 *CLCV
1530 '
1540 DIM PAL0(32767),PAL1(255),PAL2(255),PAL3(255),PAL4&(255),COUNT&(32767)
1550 '
1560 'PAL0 .. 3万色コード→256コードの表
1570 'PAL1 .. 256コード→3万色コードの表
1580 'PAL2 .. 各色グループに属する色の数
1590 'PAL3 .. 各色グループに属するドットの数
1600 'COUNT& .. 色数勘定用のワーク
1610 '
1620 LINE INPUT"色の間引き処理をする(y/n)",KY$
1630 IF KY$="Y" OR KY$="y" THEN M_F=2 ELSE M_F=1
1640 LINE INPUT"簡易ディザ表示をする(y/n)",KY$
1650 IF KY$="Y" OR KY$="y" THEN D_F=0 ELSE D_F=-1
1660 SCREEN @1
1670 '
1680 TIME$="00:00:00":GOSUB *FILE_READ
1690 '
1700 'ヒストグラム作成
1710 '
1720 CALLM CAL0&,X_WIDTH*Y_WIDTH,VARPTR(BUF(0)),VARPTR(COUNT&(0))
1730 '
1740 'FOR Y=0 TO Y_WIDTH-1 'cal0の内容
1750 ' FOR X=0 TO X_WIDTH-1
1760 ' COL=BUF(X_WIDTH*Y+X):COUNT&(COL)=COUNT&(COL)+1
1770 ' NEXT
1780 'NEXT
1790 '
1800 '
1810 NUM_COL=0
1820 FOR I&=0 TO 32767
1830 IF COUNT&(I&)<>0 THEN NUM_COL=NUM_COL+1
1840 NEXT
1850 PRINT "総色数 =";NUM_COL
1860 '
1870 IF M_F=1 THEN 2100
1880 '
1890 '
1900 '間引き
1910 '
1920 FOR I&=0 TO 32767
1930 FLG=0
1940 IF I&>0 THEN IF COUNT&(I&-1)<>0 THEN FLG=1
1950 IF I&<32767 THEN IF COUNT&(I&+1)<>0 THEN FLG=FLG+1
1960 IF I&>31 THEN IF COUNT&(I&-32)<>0 THEN FLG=FLG+1
1970 IF I&<32736 THEN IF COUNT&(I&+32)<>0 THEN FLG=FLG+1
1980 IF I&>1023 THEN IF COUNT&(I&-1024)<>0 THEN FLG=FLG+1
1990 IF I&<31744 THEN IF COUNT&(I&+1024)<>0 THEN FLG=FLG+1
2000 IF FLG=6 THEN COUNT&(I&)=0
2010 NEXT
2020 '
2030 NUM_COL=0
2040 FOR I&=0 TO 32767
2050 IF COUNT&(I&)<>0 THEN NUM_COL=NUM_COL+1
2060 NEXT
2070 PRINT "間引き後色数 =";NUM_COL
2080 '
2090 '
2100 '各色グループに含まれる色数を調べる
2110 '
2120 ERASE PAL2:DIM PAL2(255) '配列クリア
2130 FOR I&=0 TO 32767
2140 IF COUNT&(I&)=0 THEN 2190
2150 'G=I&\1024:R=(I& AND &H3E0)/32:B=I& AND 31
2160 CALLM CAL5&,I&,VARPTR(G),VARPTR(R),VARPTR(B)
2170 COL=(G\4)*32+(R\4)*4+(B\8)
2180 PAL2(COL)=PAL2(COL)+1
2190 NEXT
2200 '
2210 IF A_F=1 THEN 2380
2220 '
2230 '
2240 '各色グループに含まれるドット数を調べる
2250 '
2260 ERASE PAL4&:DIM PAL4&(255) '配列クリア
2270 FOR I&=0 TO X_WIDTH*Y_WIDTH-1
2280 COL=BUF(I&):IF COUNT&(COL)=0 THEN 2320
2290 'G=COL\1024:R=(COL AND &H3E0)/32:B=COL AND 31
2300 CALLM CAL5&,COL,VARPTR(G),VARPTR(R),VARPTR(B)
2310 COL=(G\4)*32+(R\4)*4+(B\8):PAL4&(COL)=PAL4&(COL)+1
2320 NEXT
2330 '
2340 'パレットの割当て数の算出
2350 '
2360 IF A_F=2 THEN 2500
2370 '
2380 PNUM=255
2390 PTOT=0
2400 FOR I=0 TO 255
2410 IF PAL2(I)=0 THEN 2440
2420 PAL3(I)=INT(PAL2(I)/NUM_COL*PNUM):IF PAL3(I)=0 THEN PAL3(I)=1
2430 PTOT=PTOT+PAL3(I)
2440 NEXT
2450 IF PTOT>250 THEN PNUM=PNUM-1:GOTO 2390
2460 IF NOT(PTOT>240 AND PTOT=<250) THEN PNUM=PNUM+1:GOTO 2390
2470 '
2480 GOTO 2660
2490 '
2500 FOR I=0 TO 255
2510 PAL4&(I)=PAL2(I)*PAL4&(I):TOT&=TOT&+PAL4&(I)
2520 NEXT
2530 PNUM=255
2540 PTOT=0
2550 FOR I=0 TO 255
2560 IF PAL4&(I)=0 THEN 2590
2570 PAL3(I)=INT(PAL4&(I)/TOT&*PNUM):IF PAL3(I)=0 THEN PAL3(I)=1
2580 PTOT=PTOT+PAL3(I)
2590 NEXT
2600 IF PTOT>250 THEN PNUM=PNUM-1:GOTO 2540
2610 IF NOT(PTOT>240 AND PTOT=<250) THEN PNUM=PNUM+1:GOTO 2540
2620 '
2630 '
2640 'TownsPaint対策
2650 '
2660 PAL1(0)=0:PAL1(255)=&H7FFF:PAL1(182)=&H6318
2670 '
2680 'パレット設定
2690 '
2700 FOR I&=0 TO 32767:PAL0(I&)=-1:NEXT
2710 '
2720 PNUM=1
2730 FOR I=0 TO 255
2740 IF PAL3(I)=0 THEN 2900
2750 COL=(I\32)*4*1024+(I AND &H1C)*32+(I AND 3)*8
2760 FOR J=1 TO PAL3(I) 'そのグループ内の上位色を調べる
2770 IF PNUM=>254 THEN 2890
2780 PMAX&=0
2790 FOR G=0 TO 3
2800 FOR R=0 TO 3
2810 FOR B=0 TO 7
2820 COL2=COL+G*1024+R*32+B
2830 IF PMAX&<COUNT&(COL2) THEN PMAX&=COUNT&(COL2):PCNT=COL2
2840 NEXT
2850 NEXT
2860 NEXT
2870 PAL1(PNUM)=PCNT:PAL0(PCNT)=PNUM:COUNT&(PCNT)=0
2880 PNUM=PNUM+1:IF PNUM=182 THEN PNUM=183
2890 NEXT
2900 NEXT
2910 '
2920 '
2930 '表示
2940 '
2950 SCREEN@ 2:PALETTE
2960 '
2970 FOR I=0 TO 255:PAL2(I)=PAL1(I):NEXT
2980 FOR Y=0 TO Y_WIDTH-1
2990 FOR X=0 TO X_WIDTH-1
3000 COL=BUF(Y*X_WIDTH+X)
3010 CALLM CAL5&,COL,VARPTR(G),VARPTR(R),VARPTR(B)
3020 COL=PAL0(COL):IF COL<>-1 THEN 3110
3030 COL=CALLM(CAL3&,G,R,B,VARPTR(PAL1(0))) '似ている色を探す
3040 IF D_F THEN 3110
3050 PAL2(COL)=0 'その次に似ている色を探す
3060 COL2=CALLM(CAL3&,G,R,B,VARPTR(PAL2(0))):PAL2(COL)=PAL1(COL)
3070 CALLM CAL5&,PAL1(COL),VARPTR(G1),VARPTR(R1),VARPTR(B1)
3080 CALLM CAL5&,PAL1(COL2),VARPTR(G2),VARPTR(R2),VARPTR(B2)
3090 IF ABS(G1-G)+ABS(R1-R)+ABS(B1-B)<ABS((G1+G2)/2-G)+ABS((R1+R2)/2-R)+ABS((B1+B2)/2-B) THEN 3110
3100 IF RND>.5! THEN COL=COL2
3110 PSET(X+OX,Y+OY),%COL
3120 NEXT
3130 NEXT
3140 CLOSE
3150 '
3160 ' MAKE HEADER
3170 BIT=8:GOSUB *MAKE_BUF:RESTORE *HEAD25:CNT=0:GOSUB *READ_DATA
3180 ' PALETTE
3190 FOR I=0 TO 255
3200 G=(PAL1(I) AND &H7C00)/1024
3210 R=(PAL1(I) AND &H3E0)/32
3220 B=(PAL1(I) AND 31)
3230 PALETTE I,[G*8,R*8,B*8]
3240 IF R<>0 THEN BF&=(R*8+7)*256 ELSE BF&=0
3250 IF BF&>32767 THEN BF&=BF&-65536
3260 BUF(CNT)=BF&:CNT=CNT+1
3270 IF G<>0 THEN BF&=(G*8+7)*256 ELSE BF&=0
3280 IF BF&>32767 THEN BF&=BF&-65536
3290 BUF(CNT)=BF&:CNT=CNT+1
3300 IF B<>0 THEN BF&=(B*8+7)*256 ELSE BF&=0
3310 IF BF&>32767 THEN BF&=BF&-65536
3320 BUF(CNT)=BF&:CNT=CNT+1
3330 NEXT
3340 '
3350 GOSUB *DATA_SAVE
3360 SYMBOL(0,0),"所要時間:"+TIME$,1,1,7,,,8
3370 RETURN
3380 '
3390 '
3400 '*** モノクロ256階調
3410 '
3420 *MN256
3430 TIME$="00:00:00":GOSUB *FILE_READ
3440 '
3450 SCREEN @2:PALETTE
3460 '
3470 IF NOT(X_FLG) THEN 3590
3480 '
3490 FOR Y=0 TO Y_WIDTH-1
3500 FOR X=0 TO X_WIDTH-1
3510 COL=BUF(X_WIDTH*Y+X)
3520 G=(COL\1024)*8:R=(COL AND &H3E0)/32*8:B=(COL AND 31)*8
3530 L=INT((G*6+R*3+B)/10)
3540 IF L=182 AND O_F=4 THEN L=183 'TownsPaint対策
3550 PSET(X+OX,Y+OY),%L
3560 NEXT
3570 NEXT
3580 GOTO 3810
3590 '
3600 FOR Y=0 TO Y_WIDTH-2 STEP 2
3610 FOR X=0 TO X_WIDTH-2 STEP 2
3620 COL=BUF(X_WIDTH/2*INT(Y/2)+INT(X/2))
3630 G=(COL\1024)*8:R=(COL AND &H3E0)/32*8:B=(COL AND 31)*8
3640 L=INT((G*6+R*3+B)/10)
3650 IF X=X_WIDTH-2 OR Y=Y_WIDTH-2 THEN 3760
3660 FOR DY=0 TO 1
3670 FOR DX=0 TO 1
3680 COL=BUF(X_WIDTH/2*(INT(Y/2)+DY)+INT(X/2)+DX)
3690 G=(COL\1024)*8:R=(COL AND &H3E0)/32*8:B=(COL AND 31)*8
3700 L2=INT((G*6+R*3+B)/10):L2=(L+L2)/2
3710 IF L2=182 AND O_F=4 THEN L2=183 'TownsPaint対策
3720 PSET(X+OX+DX,Y+OY+DY),%L2
3730 NEXT
3740 NEXT
3750 GOTO 3770
3760 LINE(X+OX,Y+OY)-(X+OX+1,Y+OY+1),PSET,%L,BF
3770 NEXT
3780 NEXT
3790 '
3800 ' MAKE HEADER
3810 BIT=8:GOSUB *MAKE_BUF:RESTORE *HEAD25:CNT=0:GOSUB *READ_DATA
3820 ' PALETTE
3830 FOR I=0 TO 255
3840 PALETTE I,[I,I,I]
3850 BF&=I*256:IF BF&>32767 THEN BF&=BF&-65536
3860 BUF(CNT)=BF&:BUF(CNT+1)=BUF(CNT):BUF(CNT+2)=BUF(CNT):CNT=CNT+3
3870 NEXT
3880 '
3890 GOSUB *DATA_SAVE
3900 SYMBOL(0,0),"所要時間:"+TIME$,1,1,7,,,8
3910 RETURN
3920 '
3930 '
3940 '*** モノクロ16階調
3950 '
3960 *MN16_32
3970 S_F=32:GOTO *MN16
3980 *MN16_48
3990 S_F=48:GOTO *MN16
4000 *MN16
4010 TIME$="00:00:00":GOSUB *FILE_READ
4020 '
4030 SCREEN@ 0:FOR I=0 TO 15:PALETTE I,[I*16,I*16,I*16]:NEXT
4040 '
4050 FOR Y=0 TO Y_WIDTH-1
4060 FOR X=0 TO X_WIDTH-1
4070 IF X_F THEN COL=BUF(X_WIDTH*Y+X) ELSE COL=BUF(X_WIDTH/2*INT(Y/2)+INT(X/2))
4080 G=(COL\1024)*8:R=(COL AND &H3E0)/32*8:B=(COL AND 31)*8
4090 '
4100 IF S_F<>32 THEN 4150
4110 L=INT((G*6+G*3+B)/160*2)
4120 IF (L MOD 2)=0 THEN L=L/2:GOTO 4200
4130 IF (L MOD 2)=1 THEN L=INT(L/2)+ABS(RND>.5!):GOTO 4200
4140 '
4150 L=INT((G*6+G*3+B)/160*3)
4160 IF (L MOD 3)=0 THEN L=L/3:GOTO 4200
4170 IF (L MOD 3)=1 THEN L=INT(L/3)+ABS(RND>.66!):GOTO 4200
4180 IF (L MOD 3)=2 THEN L=INT(L/3)+ABS(RND>.33!):GOTO 4200
4190 '
4200 IF L<0 THEN L=0
4210 IF L>15 THEN L=15
4220 PSET(X+OX,Y+OY),%L
4230 NEXT
4240 NEXT
4250 CLOSE
4260 '
4270 ' MAKE HEADER
4280 BIT=4:GOSUB *MAKE_BUF:RESTORE *HEAD16:CNT=0:GOSUB *READ_DATA
4290 ' PALETTE
4300 BUF(CNT)=0:BUF(CNT+1)=0:BUF(CNT+2)=0:CNT=CNT+3
4310 FOR I=1 TO 15
4320 BF&=(I*16+15)*256:IF BF&>32767 THEN BF&=BF&-65536
4330 BUF(CNT)=BF&:BUF(CNT+1)=BUF(CNT):BUF(CNT+2)=BUF(CNT):CNT=CNT+3
4340 NEXT
4350 '
4360 GOSUB *DATA_SAVE
4370 SYMBOL(0,0),"所要時間:"+TIME$,1,1,7,,,8
4380 RETURN
4390 '
4400 '
4410 '
4420 '*** 256色固定カラー
4430 '
4440 *CL256
4450 DIM BG&(639,1),BR&(639,1),BB&(639,1),SKR(6),SKG(6),SKB(6)
4460 '
4470 FOR I=1 TO 7:SKR(I-1)=INT(256*31*I/7):SKG(I-1)=SKR(I-1):NEXT
4480 FOR I=1 TO 3:SKB(I-1)=INT(256*31*I/3):NEXT
4490 '
4500 TIME$="00:00:00":GOSUB *FILE_READ
4510 '
4520 SCREEN@ 2:PALETTE
4530 '
4540 FOR Y=0 TO Y_WIDTH-1
4550 LC=(Y AND 1):LB=(Y+1) AND 1
4560 CG&=0:CB&=0:CR&=0
4570 FOR X=0 TO X_WIDTH-1
4580 BG&(X,LB)=0:BR&(X,LB)=0:BB&(X,LB)=0
4590 NEXT
4600 FOR X=0 TO X_WIDTH-1
4610 IF X_F THEN COL=BUF(X_WIDTH*Y+X) ELSE COL=BUF(X_WIDTH/2*INT(Y/2)+INT(X/2))
4620 CALLM CAL5&,COL,VARPTR(G),VARPTR(R),VARPTR(B)
4630 CG&=CG&+G*256+BG&(X,LC)
4640 CR&=CR&+R*256+BR&(X,LC)
4650 CB&=CB&+B*256+BB&(X,LC)
4660 DG=0:DB=0:DR=0
4670 FOR I=6 TO 0 STEP -1
4680 IF CG& >= SKG(I) THEN DG=I+1:CG&=CG&-SKG(I):I=-1
4690 NEXT
4700 FOR I=6 TO 0 STEP -1
4710 IF CR& >= SKR(I) THEN DR=I+1:CR&=CR&-SKR(I):I=-1
4720 NEXT
4730 FOR I=2 TO 0 STEP -1
4740 IF CB& >= SKB(I) THEN DB=I+1:CB&=CB&-SKB(I):I=-1
4750 NEXT
4760 L=INT(DG)*32+INT(DR)*4+DB
4770 IF L=182 AND O_F=4 THEN L=181 'TownsPaint対策
4780 PSET(X+OX,Y+OY),%L
4790 CALLM CAL6&,VARPTR(BG&(X,LB)),CG&,-3
4800 CALLM CAL6&,VARPTR(BR&(X,LB)),CR&,-3
4810 CALLM CAL6&,VARPTR(BB&(X,LB)),CB&,-3
4820 IF X>0 THEN EX=X-1 ELSE EX=X
4830 CALLM CAL6&,VARPTR(BG&(EX,LB)),CG&,-2
4840 CALLM CAL6&,VARPTR(BR&(EX,LB)),CR&,-2
4850 CALLM CAL6&,VARPTR(BB&(EX,LB)),CB&,-2
4860 IF X<X_WIDTH-1 THEN EX=X+1 ELSE EX=X
4870 CALLM CAL6&,VARPTR(BG&(EX,LB)),CG&,-3
4880 CALLM CAL6&,VARPTR(BR&(EX,LB)),CR&,-3
4890 CALLM CAL6&,VARPTR(BB&(EX,LB)),CB&,-3
4900 CG&=CG&/2:CR&=CR&/2:CB&=CB&/2
4910 NEXT
4920 NEXT
4930 CLOSE
4940 '
4950 ' MAKE HEADER
4960 BIT=8:GOSUB *MAKE_BUF:RESTORE *HEAD25:CNT=0:GOSUB *READ_DATA
4970 ' PALETTE
4980 BUF(CNT)=0:BUF(CNT+1)=0:BUF(CNT+2)=0:CNT=CNT+3
4990 FOR I=1 TO 15
5000 BF&=(I*16+15)*256:IF BF&>32767 THEN BF&=BF&-65536
5010 BUF(CNT)=BF&:BUF(CNT+1)=BUF(CNT):BUF(CNT+2)=BUF(CNT):CNT=CNT+3
5020 NEXT
5030 '
5040 GOSUB *DATA_SAVE
5050 SYMBOL(0,0),"所要時間:"+TIME$,1,1,7,,,8
5060 RETURN
5070 '
5080 '
5090 '
5100 '*** 8色固定カラー
5110 '
5120 *CL8
5130 DIM BG&(639,1),BR&(639,1),BB&(639,1)
5140 TIME$="00:00:00":GOSUB *FILE_READ
5150 '
5160 SCREEN@ 0:PALETTE
5170 '
5180 FOR Y=0 TO Y_WIDTH-1
5190 LC=(Y AND 1):LB=(Y+1) AND 1
5200 CG&=0:CB&=0:CR&=0
5210 FOR X=0 TO X_WIDTH-1
5220 BG&(X,LB)=0:BR&(X,LB)=0:BB&(X,LB)=0
5230 NEXT
5240 FOR X=0 TO X_WIDTH-1
5250 IF X_F THEN COL=BUF(X_WIDTH*Y+X) ELSE COL=BUF(X_WIDTH/2*INT(Y/2)+INT(X/2))
5260 CALLM CAL5&,COL,VARPTR(G),VARPTR(R),VARPTR(B)
5270 CG&=CG&+G*256+BG&(X,LC)
5280 CR&=CR&+R*256+BR&(X,LC)
5290 CB&=CB&+B*256+BB&(X,LC)
5300 CL=8
5310 IF CG&>=&H1F00 THEN CL=CL+4:CG&=CG&-&H1F00
5320 IF CR&>=&H1F00 THEN CL=CL+2:CR&=CR&-&H1F00
5330 IF CB&>=&H1F00 THEN CL=CL+1:CB&=CB&-&H1F00
5340 IF CL<>8 THEN PSET(X+OX,Y+OY),%CL
5350 CALLM CAL6&,VARPTR(BG&(X,LB)),CG&,-3
5360 CALLM CAL6&,VARPTR(BR&(X,LB)),CR&,-3
5370 CALLM CAL6&,VARPTR(BB&(X,LB)),CB&,-3
5380 IF X>0 THEN EX=X-1 ELSE EX=0
5390 CALLM CAL6&,VARPTR(BG&(EX,LB)),CG&,-2
5400 CALLM CAL6&,VARPTR(BR&(EX,LB)),CR&,-2
5410 CALLM CAL6&,VARPTR(BB&(EX,LB)),CB&,-2
5420 IF X<X_WIDTH-1 THEN EX=X+1 ELSE EX=X
5430 CALLM CAL6&,VARPTR(BG&(EX,LB)),CG&,-3
5440 CALLM CAL6&,VARPTR(BR&(EX,LB)),CR&,-3
5450 CALLM CAL6&,VARPTR(BB&(EX,LB)),CB&,-3
5460 CG&=CG&/2:CR&=CR&/2:CB&=CB&/2
5470 NEXT
5480 NEXT
5490 CLOSE
5500 '
5510 ' MAKE HEADER
5520 BIT=4:GOSUB *MAKE_BUF:RESTORE *HEAD16:CNT=0:GOSUB *READ_DATA
5530 ' PALETTE
5540 BUF(CNT)=0:BUF(CNT+1)=0:BUF(CNT+2)=0:CNT=CNT+3
5550 FOR I=1 TO 15
5560 BF&=(I*16+15)*256:IF BF&>32767 THEN BF&=BF&-65536
5570 BUF(CNT)=BF&:BUF(CNT+1)=BUF(CNT):BUF(CNT+2)=BUF(CNT):CNT=CNT+3
5580 NEXT
5590 '
5600 GOSUB *DATA_SAVE
5610 SYMBOL(0,0),"所要時間:"+TIME$,1,1,7,,,8
5620 RETURN
5630 '
5640 '
5650 '
5660 '*** モノクロ単色
5670 '
5680 *MN1
5690 DIM BG&(639,1)
5700 '
5710 TIME$="00:00:00":GOSUB *FILE_READ
5720 '
5730 SCREEN@ 0:PALETTE
5740 '
5750 FOR Y=0 TO Y_WIDTH-1
5760 LC=(Y AND 1):LB=(Y+1) AND 1
5770 CG&=0
5780 FOR X=0 TO X_WIDTH-1
5790 BG&(X,LB)=0
5800 NEXT
5810 FOR X=0 TO X_WIDTH-1
5820 IF X_F THEN COL=BUF(X_WIDTH*Y+X) ELSE COL=BUF(X_WIDTH/2*INT(Y/2)+INT(X/2))
5830 CALLM CAL5&,COL,VARPTR(G),VARPTR(R),VARPTR(B)
5840 COL=INT(((G*6+R*3+B)/10)*256)
5850 CG&=CG&+COL+BG&(X,LC)
5860 IF CG&>=&H1F00 THEN CG&=CG&-&H1F00:PSET(X+OX,Y+OY),%15
5870 CALLM CAL6&,VARPTR(BG&(X,LB)),CG&,-3
5880 IF X>0 THEN EX=X-1 ELSE EX=X
5890 CALLM CAL6&,VARPTR(BG&(EX,LB)),CG&,-2
5900 IF X<X_WIDTH-1 THEN EX=X+1 ELSE EX=X
5910 CALLM CAL6&,VARPTR(BG&(EX,LB)),CG&,-3
5920 CG&=INT(CG&/2)
5930 NEXT
5940 NEXT
5950 CLOSE
5960 '
5970 IF O_F=4 THEN 6030
5980 ' MAKE TIF HEADER
5990 BIT=1:GOSUB *MAKE_BUF:RESTORE *HEADTIF:CNT=0:GOSUB *READ_DATA
6000 CNT=248:GOSUB *READ_DATA
6010 GOTO 6110
6020 ' MAKE HEADER
6030 BIT=4:GOSUB *MAKE_BUF:RESTORE *HEAD16:CNT=0:GOSUB *READ_DATA
6040 ' PALETTE
6050 BUF(CNT)=0:BUF(CNT+1)=0:BUF(CNT+2)=0:CNT=CNT+3
6060 FOR I=1 TO 15
6070 BF&=(I*16+15)*256:IF BF&>32767 THEN BF&=BF&-65536
6080 BUF(CNT)=BF&:BUF(CNT+1)=BUF(CNT):BUF(CNT+2)=BUF(CNT):CNT=CNT+3
6090 NEXT
6100 '
6110 GOSUB *DATA_SAVE
6120 SYMBOL(0,0),"所要時間:"+TIME$,1,1,7,,,8
6130 RETURN
6140 '
6150 '
6160 '*** サブルーチン ***
6170 '
6180 *FILE_READ
6190 GOSUB *FILE_OPEN
6200 IF X_WIDTH>512 OR Y_WIDTH>256 THEN GOSUB *FILE_GET:GOTO 6250
6210 CLOSE:LOAD@ FIN$:GET@A(0,0)-(X_WIDTH-1,Y_WIDTH-1),BUF
6220 '
6230 IF NOT(X_F) THEN X_WIDTH=X_WIDTH*2:Y_WIDTH=Y_WIDTH*2
6240 IF C_F THEN OX=(640-X_WIDTH)/2:OY=(480-Y_WIDTH)/2 ELSE OX=0:OY=0
6250 RETURN
6260 '
6270 '
6280 *FILE_OPEN
6290 OPEN "I",#1,FIN$
6300 ID$=INPUT$(3,1):DMY$=INPUT$(1,1)
6310 IF ID$="II*" THEN BYTE_ORDER=1:GOTO 6350
6320 IF ID$="MM*" THEN BYTE_ORDER=0:GOTO 6350
6330 PRINT "TIFFファイルではありません":END
6340 '
6350 GOSUB *GETLONG:IFD_OFST=VALUE&
6360 '
6370 CLOSE:OPEN "I",#1,FIN$:FOR I=1 TO IFD_OFST:DMY$=INPUT$(1,1):NEXT
6380 GOSUB *GETWORD:NUM_IFD=VALUE&:PRINT :PRINT "Reading TAG = ";
6390 FOR I=1 TO NUM_IFD
6400 GOSUB *GETTAG:PRINT HEX$(TAG);" ";
6410 IF TAG=&H100 THEN X_WIDTH=DT&
6420 IF TAG=&H101 THEN Y_WIDTH=DT&
6430 IF TAG=&H102 THEN COL=DT&
6440 IF TAG=&H103 THEN ASSUKU=DT&
6450 IF TAG=&H111 THEN OFFSET=DT&
6460 IF TAG=&H117 THEN DATA_SIZE&=DT&
6470 IF TAG=&H140 THEN PAL_OFFSET=DT&
6480 NEXT
6490 PRINT :CLOSE
6500 IF ASSUKU<>1 THEN PRINT "非圧縮ファイルしか扱えません":END
6510 IF COL<>16 THEN PRINT "3万色ファイルではありません":END
6520 '
6530 OPEN "I",#1,FIN$
6540 FOR I=1 TO OFFSET/128:A$=INPUT$(128,1):NEXT
6550 '
6560 IF NOT(X_F) AND (X_WIDTH>320 OR Y_WIDTH>240) THEN X_F=-1: PRINT "元画像が320×240ドットより大きいので拡大処理はできません"
6570 RETURN
6580 '
6590 *GETTAG
6600 GOSUB *GETWORD:TAG=VALUE&
6610 GOSUB *GETWORD:TYPE=VALUE&
6620 GOSUB *GETLONG
6630 GOSUB *GETLONG:DT&=VALUE&
6640 RETURN
6650 '
6660 *FILE_GET
6670 FOR I&=0 TO X_WIDTH*Y_WIDTH-1
6680 GOSUB *GETWORD:DT&=VALUE&
6690 IF DT&>32767 THEN DT&=DT&-65536
6700 BUF(I&)=DT&
6710 NEXT
6720 CLOSE:RETURN
6730 '
6740 *GETWORD
6750 IF BYTE_ORDER=1 THEN VALUE&=ASC(INPUT$(1,1))+ASC(INPUT$(1,1))*256
6760 IF BYTE_ORDER=0 THEN VALUE&=ASC(INPUT$(1,1))*256+ASC(INPUT$(1,1))
6770 RETURN
6780 '
6790 *GETLONG
6800 IF BYTE_ORDER=1 THEN VALUE&=ASC(INPUT$(1,1))+ASC(INPUT$(1,1))*256+ASC(INPUT$(1,1))*65536+ASC(INPUT$(1,1))*16777216
6810 IF BYTE_ORDER=0 THEN VALUE&=ASC(INPUT$(1,1))*16777216+ASC(INPUT$(1,1))*65536+ASC(INPUT$(1,1))*256+ASC(INPUT$(1,1))
6820 RETURN
6830 '
6840 *MAKE_BUF
6850 ERASE BUF
6860 IF C_F THEN 6930
6870 IF BIT=1 THEN BUFSIZE&=INT((INT((X_WIDTH+7)/8)*Y_WIDTH+1)/2)
6880 IF BIT=4 THEN BUFSIZE&=INT((INT((X_WIDTH+7)/8)*Y_WIDTH*4+1)/2)
6890 IF BIT=8 THEN BUFSIZE&=INT((X_WIDTH*Y_WIDTH+1)/2)
6900 DIM BUF(BUFSIZE&+787)
6910 IF BIT=1 THEN DIM BUF2(BUFSIZE&)
6920 RETURN
6930 IF BIT=1 THEN BUFSIZE&=19200
6940 IF BIT=4 THEN BUFSIZE&=76800
6950 IF BIT=8 THEN BUFSIZE&=153600
6960 DIM BUF(BUFSIZE&+787)
6970 IF BIT=1 THEN DIM BUF2(BUFSIZE&)
6980 RETURN
6990 '
7000 *DATA_SAVE
7010 BUF(CNT)=0:CNT=CNT+1 '背景番号
7020 IF C_F THEN X_WIDTH=640:Y_WIDTH=480
7030 ON O_F GOTO 7060,7080,7100,7230
7040 RETURN
7050 'パレット無TIF
7060 SAVE@ FOUT$,(0,0)-(X_WIDTH-1,Y_WIDTH-1):RETURN
7070 'パレット有TIF
7080 SAVE@ FOUT$,(0,0)-(X_WIDTH-1,Y_WIDTH-1),1:RETURN
7090 '単色TIF
7100 BUF(15)=X_WIDTH:BUF(21)=Y_WIDTH
7110 GET@(0,0)-(X_WIDTH-1,Y_WIDTH-1),BUF2,0
7120 FOR I=0 TO BUFSIZE&:BUF(256+I)=BUF2(I):NEXT
7130 PTH$="":NM$="":I=LEN(FOUT$):D$=RIGHT$(FOUT$,1)
7140 WHILE I<>0 AND D$<>"\" AND D$<>":"
7150 D$=MID$(FOUT$,I,1)
7160 NM$=D$+NM$:I=I-1
7170 WEND
7180 PTH$=LEFT$(FOUT$,I)
7190 SAVE@ PTH$+"_tmp.snc",BUF:NAME PTH$+"_tmp.snc" AS NM$
7200 RETURN
7210 '
7220 'Pxx
7230 BF&=X_WIDTH*Y_WIDTH '背景サイズ
7240 IF (BF& AND 65536)>32767 THEN BUF(CNT)=(BF& AND 65536)-65536 ELSE BUF(CNT)=(BF& AND 65536)
7250 CNT=CNT+1:BUF(CNT)=(BF& AND &HFFF0000)/65536:CNT=CNT+1
7260 BUF(CNT)=0:BUF(CNT+1)=0:CNT=CNT+2 '左上座標 (原点固定)
7270 BUF(CNT)=X_WIDTH-1:BUF(CNT+1)=Y_WIDTH-1:CNT=CNT+2 ' 右下座標
7280 GET@A(0,0)-(X_WIDTH-1,Y_WIDTH-1),BUF,CNT
7290 SAVE@ FOUT$,BUF
7300 RETURN
7310 '
7320 *READ_DATA
7330 READ D1$,D2$
7340 WHILE D1$<>"*"
7350 BF&=VAL("&H"+D2$)*256+VAL("&H"+D1$)
7360 IF BF&>32767 THEN BUF(CNT)=BF&-65536 ELSE BUF(CNT)=BF&
7370 CNT=CNT+1:READ D1$,D2$
7380 WEND
7390 RETURN
7400 '
7410 ' p16 header
7420 *HEAD16
7430 DATA 59,55,4B,49,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF
7440 DATA 01,00,03,00,00,00,00,00,*,*
7450 ' p25 header
7460 *HEAD25
7470 DATA 59,55,4B,49,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF
7480 DATA 01,00,0C,00,00,00,00,00,*,*
7490 '
7500 ' tiff mono header
7510 *HEADTIF
7520 DATA 49,49,2A,00,08,00,00,00,0F,00
7530 ' tag type length value/offset
7540 DATA FF,00, 03,00, 01,00,00,00, 01,00,00,00
7550 DATA 00,01, 03,00, 01,00,00,00, ff,ff,00,00 ' 横ドット
7560 DATA 01,01, 03,00, 01,00,00,00, ff,ff,00,00 ' 縦ドット
7570 DATA 02,01, 03,00, 01,00,00,00, 01,00,00,00 ' 1ビット/ピクセル
7580 DATA 03,01, 03,00, 01,00,00,00, 01,00,00,00 ' 圧縮なし
7590 DATA 06,01, 03,00, 01,00,00,00, 00,00,00,00 ' 2値イメージ
7600 DATA 0A,01, 03,00, 01,00,00,00, 01,00,00,00
7610 DATA 11,01, 04,00, 01,00,00,00, 00,02,00,00 ' 画像データオフセット
7620 DATA 12,01, 03,00, 01,00,00,00, 01,00,00,00
7630 DATA 15,01, 03,00, 01,00,00,00, 01,00,00,00
7640 DATA 18,01, 03,00, 01,00,00,00, 00,00,00,00
7650 DATA 19,01, 03,00, 01,00,00,00, 01,00,00,00
7660 DATA 1A,01, 05,00, 01,00,00,00, F0,01,00,00
7670 DATA 1B,01, 05,00, 01,00,00,00, F8,01,00,00
7680 DATA 1C,01, 03,00, 01,00,00,00, 01,00,00,00
7690 DATA *,* '~01EF padding NULL
7700 DATA 4B,00,00,00, 01,00,00,00 ' 1F0 横解像度 75/1
7710 DATA 4B,00,00,00, 01,00,00,00 ' 1F8 縦解像度 75/1
7720 DATA *,*