Gox語言中進(jìn)行屏幕截圖并顯示在Sciter圖形界面中-GX38.2

本例承接GX38.1一文中的例子,加了一些改進(jìn),在進(jìn)行界面截圖后,將圖片展示在用Sciter包編寫的圖形界面上。

代碼如下:

// 設(shè)置github.com/kbinani/screenshot包的簡稱
screenshot = github_kbinani_screenshot

// 獲取第一個顯示器的屏幕尺寸區(qū)域
bounds := screenshot.GetDisplayBounds(0)

// 截取該屏幕截圖
// 注意 := 和 = 作為賦值用,在Gox語言中是等價的
img, _ := screenshot.CaptureRect(bounds)


// 創(chuàng)建一個字節(jié)緩沖區(qū),用于存放圖片的二進(jìn)制數(shù)據(jù)
bufT  = new(bytes.Buffer)

// 將屏幕截圖以PNG格式編碼到緩沖區(qū)中
image_png.Encode(bufT, img)

// 獲取字節(jié)緩沖區(qū)的字節(jié)數(shù)組([]byte)類型引用
dataT =  bufT.Bytes()

// 設(shè)置github.com/sciter-sdk/go-sciter及其子包window的簡稱
sciter = github_scitersdk_gosciter
window = github_scitersdk_gosciter_window

// 將圖片的字節(jié)數(shù)組數(shù)據(jù)轉(zhuǎn)換為BASE64編碼的字符串
// 以便傳遞給Sciter
// 由于從Gox到Sciter傳遞數(shù)據(jù)在傳遞數(shù)組等復(fù)雜類型時不太方便,
// 因此最好轉(zhuǎn)換成基本類型,如字符串和數(shù)字等
// 復(fù)雜對象可以轉(zhuǎn)換成JSON字符串傳遞
base64StrT := tk.EncodeToBase64(dataT)

// 設(shè)置Sciter格式的HTML網(wǎng)頁字符串
// 除了DOM元素id屬性的設(shè)置等微小差異外,與一般的HTML網(wǎng)頁完全相同
// Sciter完整地支持HTML/HTML5,并有一定改進(jìn)
// 網(wǎng)頁中的腳本部分,則不太一樣,只支持Sciter自己的TiScript,不支持JavaScript
// TiScript可以看作JavaScript的加強(qiáng)版,增加了類似JQuery的一些功能
htmlT := `
<html>
<head>
    <script type="text/tiscript">
        
        // getImageData函數(shù)用于在Gox代碼中調(diào)用傳入圖片數(shù)據(jù)并顯示在網(wǎng)頁上
        function getImageData(imageDataStrA) {
            // 調(diào)用Bytes對象的fromString方法,默認(rèn)按BASE64方式解碼到二進(jìn)制數(shù)據(jù)
            var bytesT = Bytes.fromString(imageDataStrA)

            // 根據(jù)二進(jìn)制圖片數(shù)據(jù)生成Sciter中的圖片對象
            var imgT = Image.fromBytes(bytesT);

            // 設(shè)置第一個picture元素的值為該圖片
            $(picture).value = imgT;

            // 設(shè)置id為img1ID的<img>標(biāo)簽值為該圖片
            $(#img1ID).value = imgT;

            // 設(shè)置id為img2ID的<img>標(biāo)簽的src屬性為BASE64字符串格式的圖片
            $(img#img2ID).attributes["src"] = "data:image/png;base64,"+imageDataStrA;
        }

        // 如果要連接Sciter的Inspector調(diào)試則取消下面的注釋
        // function self.ready() {
        //    view.connectToInspector(rootElement, inspectorIpAddress);
        // }

    </script>
</head>
<body>
    <div style="margin-bottom: 10px;">Screenshots 1-3</div>

    <!-- picture標(biāo)簽相當(dāng)于加強(qiáng)的<img>標(biāo)簽 -->
    <picture style="width: 480px;"></picture>

    <img id="img1ID" style="width: 480px;"></img>

    <!-- 注意:第二個<img>標(biāo)簽使用了Sciter中便捷的id設(shè)定方法,即使用#號 -->
    <img#img2ID style="width: 480px;"></img>

    <!-- #號也可以和標(biāo)簽名之間有空格 -->
    <img #img3ID style="width: 480px;"></img>
</body>
</html>

`

// 鎖定GUI線程,理論上GUI編程都要求在同一線程中更新界面元素
runtime.LockOSThread()

// 創(chuàng)建Sciter窗口,并指定窗口區(qū)域位置及大小
w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.NewRect(0, 0, 800, 600))

checkError(err)

// 設(shè)置該窗口的一些屬性
w.SetOption(sciter.SCITER_SET_SCRIPT_RUNTIME_FEATURES, sciter.ALLOW_FILE_IO | sciter.ALLOW_SOCKET_IO | sciter.ALLOW_EVAL | sciter.ALLOW_SYSINFO)

// 載入設(shè)計好的HTML頁面
w.LoadHtml(htmlT, "")

// 設(shè)置窗口標(biāo)題
w.SetTitle("Screenshots")

// 調(diào)用getImageData并傳入圖片數(shù)據(jù)顯示
// 此時只顯示前三幅圖片,第四幅圖片將在后面用Gox代碼來載入
w.Call("getImageData", sciter.NewValue(base64StrT))

// 獲取Sciter頁面的根元素
root, _ := w.GetRootElement()

// 獲取根元素下的id為img3ID的元素
img, _ := root.SelectById("img3ID")

// 設(shè)置該元素的src屬性為BASE64格式的圖片
img.SetAttr("src", `data:image/png;base64,`+base64StrT)

// 顯示窗口并運(yùn)行GUI圖形界面
w.Show()
w.Run()

程序運(yùn)行效果截圖如下:

可以看出,在屏幕截圖后彈出的圖形界面窗口中,展示了4個同樣的屏幕截圖。整個圖形界面的代碼非常簡單也非常好懂。

代碼中已有詳盡注釋,另外補(bǔ)充說明如下:

  • Sciter包主要利用HTML/CSS/TiScript來進(jìn)行圖形界面開發(fā),可以開發(fā)本地GUI界面;Gox中通過Go語言的綁定包來與Sciter互動,可以互相傳遞數(shù)據(jù)或者調(diào)用函數(shù);也可以通過Gox代碼控制界面中的DOM元素,甚至執(zhí)行回調(diào)函數(shù);
  • Gox語言中使用Sciter包,只需要在執(zhí)行或分發(fā)時附帶一個動態(tài)鏈接庫文件,Windows下已經(jīng)隨Gox的壓縮包一起提供了,也可以用gox -initgui命令獲取最新的DLL文件;Linux或MacOS下請參看這里的安裝說明,只需進(jìn)行前兩步安裝動態(tài)鏈接庫的步驟即可;
  • 為了演示在Sciter制作的界面中的圖形標(biāo)簽的各種寫法,本例在截圖后共展示了4次相同的該截圖圖片;第一幅圖片使用了HTML中的<picture>標(biāo)簽,第二幅圖片是用一般的<img>標(biāo)簽實(shí)現(xiàn)的,第三幅圖片使用了Sciter特有的“#”號開始的id定義方式,第四幅圖片則是在Gox代碼中進(jìn)行操作的(前三幅都是Gox代碼中調(diào)用TiScript編寫的腳本實(shí)現(xiàn)的)。

注意:

  • Gox語言是脫胎于Go語言(Golang)的開源腳本語言,解釋執(zhí)行,但相比Go語言更貼近高級語言,語法硬性限制也少一些;是一門偏向快速應(yīng)用的語言,也可以說是一個集成工具;

  • Gox語言主要優(yōu)勢有三點(diǎn):

    • 第一,Gox語言本身只有一個可執(zhí)行文件,綠色免配置,下載即可使用,無需安裝Go語言環(huán)境,無需編譯,非常適合快速制作原型以及云服務(wù)器上的遠(yuǎn)程開發(fā);
    • 第二,Gox中可以直接使用絕大多數(shù)Go語言標(biāo)準(zhǔn)庫中的對象和方法函數(shù),也內(nèi)置了很多常用、優(yōu)秀的第三方庫,充分發(fā)揮Go語言多年積累的資源優(yōu)勢;
    • 第三,與很多其他主流語言不同,Gox語言著力解決了GUI圖形界面編程的問題,內(nèi)置了基于Giu(imgui)、LCL、Sciter的三套圖形界面編程庫,直接可以進(jìn)行快捷高效的圖形界面開發(fā)(LCL、Sciter只需分別下載一個動態(tài)鏈接庫文件,執(zhí)行和分發(fā)時附帶上即可),特別適合編寫演示原型系統(tǒng)。

作為腳本語言,Gox語言性能肯定不如Go語言這樣的編譯型語言快,但由于Gox語言與Go語言的緊密聯(lián)系,Gox語言編寫的腳本可以很容易的改寫成Go語言代碼,編譯執(zhí)行后就可以發(fā)揮Go語言的速度優(yōu)勢了。因此,Gox語言也比較適合做初期的Go語言調(diào)試,還有一個更直接的方式是使用Gotx(在Gox官網(wǎng)上也有下載),這是使用完全和Go語言一樣語法的解釋器,可以理解成集成了Go語言標(biāo)準(zhǔn)庫和不少第三方庫的解釋執(zhí)行的Go語言,一樣也不需要搭建Go語言環(huán)境。Gotx與Gox的區(qū)別在于,Gotx仍然遵循Go語言的文法,代碼相對復(fù)雜一些,限制也多一些,但改寫回Go語言準(zhǔn)備編譯執(zhí)行時,基本上沒有成本。

Gox的官網(wǎng)在這里,也可以在瀏覽器搜索引擎中直接搜索“gox語言”,Github頁面在這里,在這里可以看到很多Gox語言的學(xué)習(xí)指南和實(shí)際應(yīng)用實(shí)例。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容