在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

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

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

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

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

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

createPattern

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

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

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

提前準(zhǔn)備好圖片

image-20250105085559069

基本使用

  1. 基于圖片創(chuàng)建填充模版
  2. 設(shè)置到 canvas 的 fillStyle 中
  3. 進(jìn)行描繪
@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 進(jìn)行描繪
          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

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

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 坐標(biāo)值。默認(rèn)單位:vp。
cpynumber貝塞爾參數(shù)的 y 坐標(biāo)值。默認(rèn)單位:vp。
xnumber路徑結(jié)束時(shí)的 x 坐標(biāo)值。默認(rèn)單位:vp。
ynumber路徑結(jié)束時(shí)的 y 坐標(biāo)值。默認(rèn)單位: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第一個(gè)貝塞爾參數(shù)的 x 坐標(biāo)值。默認(rèn)單位:vp。
cp1ynumber第一個(gè)貝塞爾參數(shù)的 y 坐標(biāo)值。默認(rèn)單位:vp。
cp2xnumber第二個(gè)貝塞爾參數(shù)的 x 坐標(biāo)值。默認(rèn)單位:vp。
cp2ynumber第二個(gè)貝塞爾參數(shù)的 y 坐標(biāo)值。默認(rèn)單位:vp。
xnumber路徑結(jié)束時(shí)的 x 坐標(biāo)值。默認(rèn)單位:vp。
ynumber路徑結(jié)束時(shí)的 y 坐標(biāo)值。默認(rèn)單位: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 渲染的像素?cái)?shù)據(jù)。也就是說 ImageData 可以讓我們使用 canvas 對畫布中的每一個(gè)像素進(jìn)行操作。提

供了強(qiáng)大的控制能力。

實(shí)例屬性

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

這里通過 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)效果:

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

黑白效果:

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

亮度效果:

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

復(fù)古效果:

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

紅色、綠色、藍(lán)色效果:

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

透明效果:

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

馬賽克效果:

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

馬賽克效果

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

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

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

參考鏈接

  1. [數(shù)學(xué)曲線之一:貝塞爾曲線](https://zhuanlan.zhihu.com/p/711975272)
  2. [神奇 canvas 帶你實(shí)現(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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Canvas
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

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

    關(guān)注

    57

    文章

    2457

    瀏覽量

    43447
收藏 人收藏

    評論

    相關(guān)推薦

    labview五子棋程序

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

    五子棋的棋盤怎么么做

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

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

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

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

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

    用Verilog寫的一個(gè)五子棋

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

    五子棋

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

    五子棋

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

    labview 虛擬五子棋

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

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

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

    五子棋程序源代碼-Matlab實(shí)現(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的五子棋博弈算法

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

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

    鴻蒙服務(wù)實(shí)戰(zhàn)-笑笑五子棋(1) 前言 作為鴻蒙應(yīng)用的深度開發(fā)者都應(yīng)該知道,經(jīng)歷了 波瀾壯闊 1
    的頭像 發(fā)表于 03-31 09:23 ?70次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>元</b><b class='flag-5'>服務(wù)實(shí)戰(zhàn)</b>-<b class='flag-5'>笑笑</b><b class='flag-5'>五子棋</b>(1)
    主站蜘蛛池模板: 午夜在线播放视频在线观看视频 | 1024手机看片欧美日韩 | 欧美大片国产在线永久播放 | 四虎8848精品永久在线观看 | 国产精品国产主播在线观看 | 久久久久国产一级毛片高清片 | 天天躁日日躁狠狠躁中文字幕老牛 | 精品国产午夜久久久久九九 | 日本不卡视频一区二区三区 | 欧美色婷婷天堂网站 | 夜夜爽夜夜操 | 国产欧美日韩在线人成aaaa | 日本最顶级丰满的aⅴ艳星 日本最好的免费影院 | 国产精品欧美激情第一页 | 插吧插吧综合网 | 欧洲另类一二三四区 | 婷婷五月在线视频 | 午夜色网站 | 操白虎美女 | 国产精品yy9299在线观看 | 午夜va | 亚洲一级色片 | 天天射天天干天天 | 日本在线黄 | 人人人插 | 天天舔天天干天天操 | 国产 日韩 欧美 高清 | 69xxxx女人| 毛片大全免费 | 久久香蕉精品视频 | 久久国产99 | 精品三级内地国产在线观看 | 69色视频 | 丝袜美腿视频一区二区三区 | 色婷婷激婷婷深爱五月老司机 | 日本黄色片在线播放 | 亚洲精品在线视频观看 | 在线视频免费视频网站 | 泰剧天堂 | yy肉戏多纯黄的小说 | 日本精品视频一视频高清 |