标题: [特效代码] 控制台虚拟终端序列 32 位真彩色显示,支持 Alpha 通道!(仅限 Win 10 / Win 11) [打印本页]
作者: HOPE2021 时间: 2023-1-31 14:26 标题: 控制台虚拟终端序列 32 位真彩色显示,支持 Alpha 通道!(仅限 Win 10 / Win 11)
本帖最后由 HOPE2021 于 2023-1-31 14:41 编辑
您没听错,Cmd支持 32 位真彩色!
我在去年发了一篇帖子(http://www.bathome.net/viewthread.php?tid=63749),简单实现了控制台的绘图。但我觉得,仅仅是24位真彩色还不够。所以我在今天简单对32位色进行了支持。
32位色说起来也不复杂,本质上还是24位色,只不过添加了一个 Alpha 通道,经过一定运算,将其用 24 位色的形式渲染出来。
下面是32位色转24位色的算法:- 输出 = 前景色 * Alpha / 255 + 背景色 * (255 - Alpha) / 255
复制代码
下面就是我的实例:
按键说明:- < / > 换档
- + / - 值增/减 1
- O / P 值增/减 8
- [ / ] 值增/减 16
复制代码
源码:- @Mode Con: Cols=80 Lines=25 & @Echo Off & @Chcp 936 > Nul & @Title 32 位色测试
- For /L %%_ in (0,1,3) Do (
- Set lngColor[0][%%_]=127
- Set lngColor[1][%%_]=127
- Set "cur[0][%%_]= "
- Set "cur[1][%%_]= "
- )
- Set /A idx1=0
- Set /A idx2=0
- Set "cur[%idx1%][%idx2%]=#"
- @Call :LoadFunctions
- @Goto :Main
- %= VT100 虚拟终端序列 32 位色尝试 =%
-
- :Main
- Set "ESC="
- If Not Defined ESC (
- For /F "Delims=#" %%_ in ('Prompt #$E# ^& Echo On ^& For %%$ in ^(1^) Do DosKey') Do Set "ESC=%%_"
- )
- @Call :Draw
- %_Getch:#ascCode#=ascKey%
- If "%ascKey%"=="" @Goto :Main
- Set "cur[%idx1%][%idx2%]= "
-
- %==================================================================%
-
- If "%ascKey%"==">" Set "ascKey=."
- If "%ascKey%"=="<" Set "ascKey=,"
- If "%ascKey%"=="." (
- Set /A "idx2+=1"
- If %idx1% Equ 0 (If %idx2% Equ 2 (Set /A idx1=1,idx2=0))
- If %idx1% Equ 1 (If %idx2% Equ 3 (Set /A idx1=0,idx2=0))
- )
- If "%ascKey%"=="," (
- Set /A "idx2-=1"
- If %idx1% Equ 0 (If %idx2% Equ 0 (Set /A idx1=1,idx2=3))
- If %idx1% Equ 1 (If %idx2% Equ 0 (Set /A idx1=0,idx2=2))
- )
-
- %==================================================================%
-
- If "%ascKey%"=="_" Set "ascKey=-"
- If "%ascKey%"=="=" Set "ascKey=+"
-
- Set /A lngTemp=lngColor[%idx1%][%idx2%]
-
- If "%ascKey%"=="-" (
- If %lngTemp% Gtr 0 (Set /A lngColor[%idx1%][%idx2%]-=1)
- )
- If "%ascKey%"=="+" (
- If %lngTemp% Lss 255 (Set /A lngColor[%idx1%][%idx2%]+=1)
- )
-
- %==================================================================%
-
- If /I "%ascKey%"=="o" (
- If %lngTemp% Gtr 7 (Set /A lngColor[%idx1%][%idx2%]-=8) Else (Set /A lngColor[%idx1%][%idx2%]=0)
- )
- If /I "%ascKey%"=="p" (
- If %lngTemp% Lss 248 (Set /A lngColor[%idx1%][%idx2%]+=8) Else (Set /A lngColor[%idx1%][%idx2%]=255)
- )
-
- %==================================================================%
-
- If "%ascKey%"=="{" Set "ascKey=["
- If "%ascKey%"=="}" Set "ascKey=]"
-
- If "%ascKey%"=="[" (
- If %lngTemp% Gtr 15 (Set /A lngColor[%idx1%][%idx2%]-=16) Else (Set /A lngColor[%idx1%][%idx2%]=0)
- )
- If "%ascKey%"=="]" (
- If %lngTemp% Lss 240 (Set /A lngColor[%idx1%][%idx2%]+=16) Else (Set /A lngColor[%idx1%][%idx2%]=255)
- )
-
- %==================================================================%
-
- Set "cur[%idx1%][%idx2%]=#"
- @Goto :Main
-
- :LoadFunctions
- Set _Getch=Set "#ascCode#=" ^& ( For /F "Usebackq Delims=" %%_ in (`XCopy /L /W "%~f0" "%~f0" 2^^^>Nul`) Do If Not Defined #ascCode# ( Set "#ascCode#=%%_") ) ^& Call Set "#ascCode#=%%#ascCode#:~-1%%"
- @Goto :Eof
-
- :Draw
- @Call :GotoXY 3 2
- Set /P strTemp=%ESC%[?25l+<Nul
- Set "strColor[0]=%ESC%[38;2;%lngColor[0][0]%;%lngColor[0][1]%;%lngColor[0][2]%m%ESC%[48;2;%lngColor[0][0]%;%lngColor[0][1]%;%lngColor[0][2]%m"
- Set "strColor[2]=%ESC%[38;2;%lngColor[1][0]%;%lngColor[1][1]%;%lngColor[1][2]%m%ESC%[48;2;%lngColor[1][0]%;%lngColor[1][1]%;%lngColor[1][2]%m"
- Set /A "lngR=%lngColor[1][0]%*%lngColor[1][3]%/255+%lngColor[0][0]%*(255-%lngColor[1][3]%)/255"
- Set /A "lngG=%lngColor[1][1]%*%lngColor[1][3]%/255+%lngColor[0][1]%*(255-%lngColor[1][3]%)/255"
- Set /A "lngB=%lngColor[1][2]%*%lngColor[1][3]%/255+%lngColor[0][2]%*(255-%lngColor[1][3]%)/255"
- Set "strColor[1]=%ESC%[38;2;%lngR%;%lngG%;%lngB%m%ESC%[48;2;%lngR%;%lngG%;%lngB%m"
-
- For /L %%_ in (0,1,2) Do (
- For /L %%` in (0,1,23) Do Set /P strTemp=-<Nul
- Set /P strTemp=+<Nul
- )
- @Call :GotoXY 3 13
- Set /P strTemp=+<Nul
- For /L %%_ in (0,1,2) Do (
- For /L %%` in (0,1,23) Do Set /P strTemp=-<Nul
- Set /P strTemp=+<Nul
- )
- SetLocal EnableExtensions EnableDelayedExpansion
- For /L %%_ in (3,1,12) Do (
- @Call :GotoXY 3 %%_
- Set /P strTemp=%ESC%[37m%ESC%[40m^|<Nul
- For /L %%` in (0,1,2) Do (
- Set /P strTemp=!strColor[%%`]!<Nul
- For /L %%[ in (0,1,23) Do Set /P strTemp=#<Nul
- Set /P strTemp=%ESC%[37m%ESC%[40m^|<Nul
- )
- )
- EndLocal
-
- %==================================================================%
-
- @Call :GotoXY 3 16
- (Echo.背景色:[%cur[0][0]%]R:%lngColor[0][0]% [%cur[0][1]%]G:%lngColor[0][1]% [%cur[0][2]%]B:%lngColor[0][2]% )
- @Call :GotoXY 3 18
- (Echo.前景色:[%cur[1][0]%]R:%lngColor[1][0]% [%cur[1][1]%]G:%lngColor[1][1]% [%cur[1][2]%]B:%lngColor[1][2]% [%cur[1][3]%]A:%lngColor[1][3]% )
- @Goto :Eof
-
- :GotoXY
- Set /P=%ESC%[%2;%1H< Nul
- @Goto :Eof
复制代码
效果图:
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |