色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙元服務(wù)實戰(zhàn)-笑笑五子棋(3)

萬少 ? 來源:jf_22972444 ? 作者:jf_22972444 ? 2025-03-31 09:27 ? 次閱讀

鴻蒙元服務(wù)實戰(zhàn)-笑笑五子棋(3)

接上篇。上一篇主要講解了元服務(wù)的創(chuàng)建和 canvas 的一些基本使用,直線、矩形、弧形、文本、圖像等。canvas 本身還有很多其他

的功能。這里繼續(xù)圍繞 canvas 進行講解。

createPattern

createPattern(image: ImageBitmap, repetition: string | null): CanvasPattern | null

通過指定圖像和重復(fù)方式創(chuàng)建圖片填充的模板。

參數(shù)名類型必填說明
imageImageBitmap圖源對象,具體參考 ImageBitmap 對象。
repetitionstringnull

提前準備好圖片

image-20250105085559069

基本使用

  1. 基于圖片創(chuàng)建填充模版
  2. 設(shè)置到 canvas 的 fillStyle 中
  3. 進行描繪
@Entry
@Component
struct Index {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  private img: ImageBitmap = new ImageBitmap("/images/2.png")

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffff00')
        .onReady(() = > {
          // 1  基于圖片創(chuàng)建填充模版
2.
          let pattern = this.context.createPattern(this.img, 'no-repeat') // 不平鋪
          if (pattern) {
            // 2 設(shè)置到canvas的fillStyle中
            this.context.fillStyle = pattern
          }
          // 3 進行描繪
          this.context.fillRect(0, 0, 400, 400)
        })
    }
    .width('100%')
    .height('100%')
  }
}

效果

image-20250105085914214

repetition:repeat

設(shè)置平鋪

let pattern = this.context.createPattern(this.img, "repeat");

效果

image-20250105090015220

clamp

在原始邊界外繪制時,超出部分使用邊緣的顏色繪制;

let pattern = this.context.createPattern(this.img, "clamp");

image-20250105090145764

mirror

沿 x 軸和 y 軸重復(fù)翻轉(zhuǎn)繪制圖像。

let pattern = this.context.createPattern(this.img, "mirror");

image-20250105090203370

quadraticCurveTo

quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void

創(chuàng)建二次貝賽爾曲線的路徑。

參數(shù)名類型必填說明
cpxnumber貝塞爾參數(shù)的 x 坐標值。默認單位:vp。
cpynumber貝塞爾參數(shù)的 y 坐標值。默認單位:vp。
xnumber路徑結(jié)束時的 x 坐標值。默認單位:vp。
ynumber路徑結(jié)束時的 y 坐標值。默認單位:vp。

示例代碼

this.context.beginPath();
this.context.moveTo(20, 20);
this.context.quadraticCurveTo(100, 100, 200, 20);
this.context.stroke();

效果

image-20250105091240519

輔助理解

img


image-20250105091007706

bezierCurveTo

bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void

創(chuàng)建三次貝賽爾曲線的路徑。

參數(shù)名類型必填說明
cp1xnumber第一個貝塞爾參數(shù)的 x 坐標值。默認單位:vp。
cp1ynumber第一個貝塞爾參數(shù)的 y 坐標值。默認單位:vp。
cp2xnumber第二個貝塞爾參數(shù)的 x 坐標值。默認單位:vp。
cp2ynumber第二個貝塞爾參數(shù)的 y 坐標值。默認單位:vp。
xnumber路徑結(jié)束時的 x 坐標值。默認單位:vp。
ynumber路徑結(jié)束時的 y 坐標值。默認單位:vp。

示例代碼

this.context.beginPath()
  this.context.moveTo(10, 10)
  this.context.bezierCurveTo(20, 100, 200, 100, 200, 20)
  this.context.stroke()

效果

image-20250105091324817

輔助理解

img

image-20250105091128806

ImageData

ImageData對象可以存儲 canvas 渲染的像素數(shù)據(jù)。也就是說 ImageData 可以讓我們使用 canvas 對畫布中的每一個像素進行操作。提

供了強大的控制能力。

實例屬性

  • ImageData.data 只讀
    Uint8ClampedArray 描述了一個一維數(shù)組,包含以 RGBA 順序的數(shù)據(jù),數(shù)據(jù)使用 0255(包含)的整數(shù)表示。
  • ImageData.height 只讀
    無符號長整型(unsigned long),使用像素描述 ImageData 的實際高度。
  • ImageData.width 只讀
    無符號長整型(unsigned long),使用像素描述 ImageData 的實際寬度。

這里通過 canvas 的getImageData方法快速獲取 ImageData 數(shù)據(jù)。然后通過putImageData把處理好的內(nèi)容重新描繪到畫圖上。

@Entry
@Component
struct Index {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
  private img: ImageBitmap = new ImageBitmap("/images/2.png")

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('#ffff00')
        .onReady(() = > {
          this.context.drawImage(this.img, 0, 0, 130, 130)
          // 獲取了 ImageData 示例
          let imagedata = this.context.getImageData(50, 50, 130, 130)
          // 又重新描繪到canvas上
          this.context.putImageData(imagedata, 150, 150)
        })
    }
    .width('100%')
    .height('100%')
  }
}

效果

image-20250105092307492

ImageData 反色

this.context.drawImage(this.img, 0, 0, 130, 130);
// 獲取了 ImageData 示例
let imagedata = this.context.getImageData(50, 50, 130, 130);
// console.log("xxx,", JSON.stringify(imagedata.data))
Object.keys(imagedata.data).forEach((k) = > {
  // 反色
  imagedata.data[k] = 255 - imagedata.data[k];
});
// 又重新描繪到canvas上
this.context.putImageData(imagedata, 150, 150);

image-20250105092847039

ImageData 其他效果

反轉(zhuǎn)效果:

  • 原理:通過將每個像素的 RGB 值取反來實現(xiàn)反轉(zhuǎn)效果。
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后遍歷每個像素,將每個像素的 RGB 值取反,再使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

黑白效果:

  • 原理:將每個像素的 RGB 值轉(zhuǎn)換為灰度值,使圖像變?yōu)楹诎住?/li>
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后遍歷每個像素,將每個像素的 RGB 值轉(zhuǎn)換為灰度值(R、G、B 三個分量取平均值),再使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

亮度效果:

  • 原理:調(diào)整每個像素的亮度值,使圖像變亮或變暗。
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后遍歷每個像素,調(diào)整每個像素的亮度值,再使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

復(fù)古效果:

  • 原理:通過調(diào)整每個像素的色調(diào)、飽和度和亮度,使圖像呈現(xiàn)復(fù)古效果。
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后遍歷每個像素,調(diào)整每個像素的色調(diào)、飽和度和亮度,再使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

紅色、綠色、藍色效果:

  • 原理:增加或減少每個像素的紅色、綠色、藍色分量的值,使圖像呈現(xiàn)相應(yīng)顏色的效果。
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后遍歷每個像素,增加或減少每個像素的紅色、綠色、藍色分量的值,再使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

透明效果:

  • 原理:調(diào)整每個像素的透明度值,使圖像呈現(xiàn)透明效果。
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后遍歷每個像素,調(diào)整每個像素的透明度值,再使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

馬賽克效果:

  • 原理:將圖像分割為小塊,每個小塊的像素值設(shè)置為該小塊內(nèi)像素的平均值,從而實現(xiàn)馬賽克效果。
  • 實現(xiàn)方式:使用getImageData獲取圖像數(shù)據(jù),然后將圖像分割為小塊,計算每個小塊內(nèi)像素的平均值,再將該小塊內(nèi)所有像素的值設(shè)置為該平均值,最后使用putImageData將修改后的數(shù)據(jù)繪制回 Canvas。

馬賽克效果

  • 由于實際操作過程中,上述馬賽克效果處理性能比較底下,這里用來一個取巧的效果來實現(xiàn)。就是先用 canvas 將畫面畫小,然后再將畫面縮放來實現(xiàn)一個模糊效果,間接實現(xiàn)馬賽克效果

漸變?yōu)V鏡效果:

  • 原理:通過在圖像上應(yīng)用漸變效果,使圖像呈現(xiàn)漸變色的效果。
  • 實現(xiàn)方式:使用createLinearGradientcreateRadialGradient創(chuàng)建漸變對象,然后使用漸變對象作為填充樣式,繪制圖像到 Canvas 上。

參考鏈接

  1. [數(shù)學(xué)曲線之一:貝塞爾曲線](https://zhuanlan.zhihu.com/p/711975272)
  2. [神奇 canvas 帶你實現(xiàn)魔法攝像頭](https://juejin.cn/post/7264125562393788473#heading-8)
  3. [ImageData](https://developer.mozilla.org/zh-CN/docs/Web/API/ImageData)

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Canvas
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    11140
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2467

    瀏覽量

    43626
收藏 0人收藏

    評論

    相關(guān)推薦

    labview五子棋程序

    本帖最后由 桂花酒 于 2012-6-10 13:43 編輯 labview五子棋程序,想用的可以看看!本來是發(fā)的求助帖,找五子棋程序,不過剛才下了一個,鑒于論壇上現(xiàn)在已經(jīng)搜不著了(我原來下過,不過刪了)一起學(xué)習(xí)!
    發(fā)表于 06-10 13:16

    五子棋的棋盤怎么么做

    做課程設(shè)計,五子棋的棋盤怎么做
    發(fā)表于 07-02 23:18

    五子棋主程序前面板怎么設(shè)計

    五子棋主程序前面板怎么設(shè)計?后面版有程序了
    發(fā)表于 07-03 16:39

    基于labview的五子棋設(shè)計

    本帖最后由 aidisheng2011 于 2014-3-21 19:50 編輯 我上網(wǎng)下載了一個labview的五子棋學(xué)習(xí)學(xué)習(xí),但是發(fā)現(xiàn)很難理解,在這里向各位大神求教。1
    發(fā)表于 03-21 13:51

    用Verilog寫的一個五子棋

    在期末EDA課答辯之際寫了一個五子棋的代碼,主要用到了VGA和PS2接口的外設(shè),因為在自己敲的時候來網(wǎng)上找過,沒找到有關(guān)的資料,所以自己寫好之后就想發(fā)上來和大家討論下。基本實現(xiàn)了雙人對戰(zhàn)五子棋的功能。感覺有很多紕漏,想請大家指點下。
    發(fā)表于 06-15 14:40

    五子棋

    求一個五子棋的程序
    發(fā)表于 06-26 16:09

    五子棋

    自己做的五子棋,說不上有什么難的
    發(fā)表于 08-12 21:44

    labview 虛擬五子棋

    `一個簡易的五子棋程序,喜歡的可以借鑒下`
    發(fā)表于 06-16 21:57

    怎樣去設(shè)計一種人機對弈五子棋程序

    五子棋游戲應(yīng)達到幾方面的要求?怎樣去設(shè)計一種人機對弈五子棋程序?
    發(fā)表于 09-29 07:26

    五子棋程序源代碼-Matlab實現(xiàn)

    五子棋程序源代碼-M
    發(fā)表于 07-04 16:15 ?50次下載

    C語言五子棋

    C語言五子棋,有趣的東西,值得玩玩,不用看著黑框發(fā)呆
    發(fā)表于 01-12 16:49 ?2次下載

    Delphi教程_使用DrawGrid控件制作五子棋

    Delphi教程使用DrawGrid控件制作五子棋,很好的Delphi的學(xué)習(xí)資料。
    發(fā)表于 03-16 14:55 ?19次下載

    C語言教程之五子棋游戲的問題

    C語言教程之五子棋游戲的問題,很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-25 17:07 ?0次下載

    基于LabVIEW的五子棋博弈算法

    針對目前五子棋人機對弈多數(shù)基于電腦、手機,缺少真實環(huán)境的問題,提出一種基于LabVIEW的博弈算法,并運用于真實的五子棋人機對弈。首先通過圖像采集系統(tǒng)獲取當前狀態(tài)下棋盤及人機雙方棋子的位置信息;然后
    發(fā)表于 12-17 11:32 ?29次下載

    鴻蒙服務(wù)實戰(zhàn)-笑笑五子棋(1)

    鴻蒙服務(wù)實戰(zhàn)-笑笑五子棋(1) 前言 作為鴻蒙應(yīng)用的深度開發(fā)者都應(yīng)該知道,經(jīng)歷了 波瀾壯闊 1
    的頭像 發(fā)表于 03-31 09:23 ?167次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>元</b><b class='flag-5'>服務(wù)實戰(zhàn)</b>-<b class='flag-5'>笑笑</b><b class='flag-5'>五子棋</b>(1)

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品
    主站蜘蛛池模板: 男男高h浪荡受h | 99在线观看 | 国产免费毛片在线观看 | 一二三四在线播放免费观看中文版视频 | 成年免费大片黄在线观看岛国 | 老师xxxx69动漫 | 四川老师边上网课边被啪视频 | 国产一卡 二卡三卡四卡无卡乱码视频 | 亚洲天堂999 | 日久精品不卡一区二区 | 乌克兰成人性色生活片 | 精品综合久久久久久8888 | 美女快播第一网 | 四虎国产精品永久免费入口 | 久久精品国产在热亚洲 | 麻豆精品一卡2卡三卡4卡免费观看 | 伊人久久免费 | 男插女高潮一区二区 | 国产看午夜精品理论片 | 丰满饥渴老太性hd | 超碰97超碰在线视频哦 | wwww69| 狠狠插影院 | 久久这里只有精品国产精品99 | sm主人调教揉花蒂H SM双性精跪趴灌憋尿调教H | 精品第一国产综合精品蜜芽 | 一本道中文无码亚洲 | 特级aa 毛片免费观看 | 法国剧丝袜情版h级在线电影 | 国产AV亚洲国产AV麻豆 | 亚洲精品久久久久中文字幕二区 | 奇米网一区二区三区在线观看 | 色欲人妻无码AV精品一区二区 | 国产成人小视频 | 男同志china免费视频 | 在线亚洲免费 | 亚洲国产中文字幕新在线 | 免费99精品国产自在现线 | 久久日本精品在线热 | 黑丝美女娇喘 | 伦理片在线线手机版韩国免费6 |