主頁 > 軟體工程 > 圖中的陰影是怎么實作的

圖中的陰影是怎么實作的

2020-09-21 07:52:29 軟體工程

各位大俠:
    我搞了好久都不知道這個陰影是怎么實作,希望有人告訴我是怎么弄的。不要程式,只要告訴我個思路。謝謝各位

uj5u.com熱心網友回復:

貌似半透明的圖片......

uj5u.com熱心網友回復:


每隔一像素設定蘭色,貌似沒透明

uj5u.com熱心網友回復:

發錯圖了,本來想發放大了7倍的圖的,看得很清楚

uj5u.com熱心網友回復:

A、就是藍點+透明色的圖,覆寫上去——這個需要GDI。
B、純VB的方式,要兩張圖。
1)白底加黑點的圖,用 AND 方式合并上去(挖掉了黑點)。
2)黑底加藍點的圖,用 OR 方式合并上去(填充了藍點)。
AND、OR 是 PaintPicture 的引數,你自己試一下。

uj5u.com熱心網友回復:

貌似可以直接畫上去吧?

uj5u.com熱心網友回復:

c# 中這個功能很好實作就是把一個picturebox設定成透明度可變的,就能解決,但VB中我試了好久都不能

uj5u.com熱心網友回復:

.Net 中的 Graphics 是 GDI+。
VB6 的 PaintPicture 是 BitBlt,所以要按我#4的B方案呼叫兩次。
可以參考這個帖子3樓,把原始圖換成白底藍點。

uj5u.com熱心網友回復:


Option Explicit
Dim m_x As Long
Dim m_y As Long

Private Sub Form_Load()
    Set Picture1.Picture = LoadPicture("D:\Administrator\desktop\1431419873_479672.bmp")
    Picture1.ScaleMode = 3
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
m_x = X
m_y = Y
Picture1.Refresh
End Sub

Private Sub Picture1_Paint()
Dim xx As Long
Dim yy As Long
    Picture1.ForeColor = &HCE6E3D
    For yy = m_y To m_y + 300 Step 2
        For xx = m_x To m_x + 300 Step 2
            Picture1.PSet (xx, yy)
        Next
    Next
End Sub

uj5u.com熱心網友回復:

PaintPicture 比 PSet 快多了!

uj5u.com熱心網友回復:

建議你做像素陣列運算,這樣處理速度會比較快(圖形處理沒速度是不行的),思路可以這樣:
通過三個GDI設備來處理影像,然后回顯到指定輸出設備(如螢屏或視窗中),步驟如下:

1、先加載原始圖片到一個指定的GDI設備,具體可用GDI+函式來加載圖片到設備(這樣兼容的影像格式多點)。
2、創建一個與你想設定“陰影”的區域大小一樣的GDI設備作為緩沖設備。
3、再創建一個最終合成用的與原圖大小一致的GDI設備。
4、可以用BitBlt函式將原始圖片設備的圖,按取圖的位置和大小把“陰影”部分圖片復制到GDI緩沖設備。
5、可以用GetBitmapBits函式將GDI緩沖設備的影像資料取出到位元組陣列中。
6、按照GDI影像資料格式修改位元組陣列中相關像素的資料內容(這和你創建的位圖格式與資料位有關,注意,位圖資料的行位元組要保持2的倍數,這是GDI的特性,而位圖檔案格式則是保持4的倍數,這就是位圖檔案的資料格式與GDI的區別,不清楚可以看看BMP檔案格式,留意BMP檔案格式資料部分,把4的倍數改成2的倍數就是GDI的位圖概念了),實作你所謂的設定“陰影”的處理程序。具體可以用類似8樓的回圈方法來回圈設定資料內容,不過要把Picture1.PSet換成設定陣列資料而已。
7、再用SetBitmapBits函式將計算好的位元組陣列資料放回到GDI緩沖設備。
8、在最終合成設備上先用BitBlt把原圖復制進去,再用BitBlt把GDI設備的圖也根據“陰影”坐標復制上去。
9、可以把合成設備的圖用BitBlt復制到PictureBox或Form等能顯示到螢屏的設備來觀察結果。

這個處理程序理論上是VB內做這種資料處理能做到最快的做法了,當然如果你通過呼叫外部API來實作相同的運算,并且用匯編或C/C++來弄,效率可能會更快,如果能用GPU、顯存什么的硬體來搞那就更沒話說了,但是,如果運算程序在vb內部,這樣是最快的了。

不要看主要程序是在第6步中,最終實作的方法可能與上面呼叫Picture1.PSet (xx, yy)差不多,但是,VB在單純的用回圈處理記憶體資料上效率與呼叫物件方法或什么API函式還是有本質區別的,由于這個設定陣列資料的執行程序相當簡單,與呼叫某個物件方法或API函式從涉及的資源呼叫與CPU指令量不是一個資源級別,所以處理速度會有根本質的差異。

比如設定一個記憶體資料只需要3潭訓編指令可完成,涉及到的資源只是直接尋址并設定內容的兩三個交換暫存器。但換做是呼叫別的什么方法或API就有可能把簡單的3潭訓編指令變成幾百或幾千潭訓編指令來執行相同的設定一個像素內容的操作,更有勝的可能會變成用幾萬潭訓編指令才能完成相同的目的。雖然在VB代碼里看上去呼叫一個方法或API很簡潔,并不顯得代碼量大,但那個方法內部撰寫可能呼叫了N個API函式來實作的,而每個API函式又是呼叫別的API或回圈N次才回傳的,這樣下去,每呼叫一次這種方法或API都有可能成千上萬倍的去執行一些多余的程序。因為那些函式為了兼容性、穩定性、資料型別什么的會做很多作業,不是單單為了設定你一個像素內容而存在的,所以真正在CPU里跑的程式并不會像VB代碼是看上去那么簡單簡潔。而直接設定記憶體資料就簡單很多,即使存在VB內部可能不會像C/C++語言或匯編那樣更加明確的處理記憶體資料,但是可想而知即使被VB轉換CPU里的代碼量也不會增加多少。這樣的程序節約了無用代碼的執行,也減少了記憶體交換的程序,程式速度自然就快了。

uj5u.com熱心網友回復:


pset確實慢,不過這種陰影效果就這么簡單,這只是提供個方法而已

參考 10 樓 SupermanKing 的回復:
建議你做像素陣列運算,這樣處理速度會比較快(圖形處理沒速度是不行的),思路可以這樣:
通過三個GDI設備來處理影像,然后回顯到指定輸出設備(如螢屏或視窗中),步驟如下:

uj5u.com熱心網友回復:


uj5u.com熱心網友回復:

制作一個藍色點陣圖,滑鼠移動時將藍色點陣圖用半透明的形式畫到背景圖上即可

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/95298.html

標籤:VB基礎類

上一篇:服務器與多客戶端間通信時,服務器能否知道哪個客戶端給他發送了資料

下一篇:VB6能否控制多點觸摸?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more