首页 > 其他分享 >pixi.js 的头像制作功能【函数】

pixi.js 的头像制作功能【函数】

时间:2023-09-10 17:56:34浏览次数:45  
标签:obj 头像 pic js width pixi let height bunny

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/pixi.min.js"></script>
    <title>pixi draw avatar</title>
</head>

<body>

    <div class="pixiCantainer" id="pixiCantainer"> </div>
    <!-- js -->
    <script>
        console.error('【本例子仅供参考,头像图片的生成应先load完之后再画,否则头像可能会变形】')

        /*
        参考资料:
        1: 画图形 : https://juejin.cn/post/7205802450573377596 ;
        
         */

        //  设置图片的裁剪位置 
        function shotAvatarWH(width, height, set_w, set_h) {
            let d = Math.abs((width - height))
            let d_position = d / 2;
            let x, y, w, h;
            if (width > height) {
                x = d_position, y = 0, w = height, h = height
            } else {
                x = 0, y = d_position, w = width, h = width
            }
            if (set_w) w = set_w
            if (set_h) h = set_h
            let obj = { x, y, w, h }
            return obj
        }


        // 制作头像的函数
        function setPicScale(pic) {
            pic.width = parseInt(pic.width);
            pic.height = Number(pic.height);
            pic.sprite_w = Number(pic.sprite_w);
            pic.sprite_h = Number(pic.sprite_h);
            let obj = { w: 0, h: 0, x: 0, y: 0 };
            let ratio_sprite = pic.sprite_w / pic.sprite_h
            let ratio_img = pic.width / pic.height
            let ratio = ratio_sprite - ratio_img

            if (pic.objectFit == 'contain') {

            } else {
                // cover
                if (pic.width == pic.height) {
                    console.warn('a类--------');
                    if (pic.sprite_w == pic.sprite_h) {
                        console.warn('a类--1------');
                        obj.w = pic.width;
                        obj.h = pic.height;
                    } else if (ratio > 0) {
                        obj.h = pic.height;
                        obj.w = pic.height * ratio_sprite;
                        console.warn('a类--2------', obj.w, obj.h)
                    } else if (ratio < 0) {
                        obj.w = pic.width;
                        obj.h = pic.width / ratio_sprite;
                        obj.y = (obj.h - pic.height) / 2;
                        console.warn('a类--3------', obj.w, obj.h)
                    }
                } else if (ratio_img > 1) {
                    console.warn('b类--------');
                    if (ratio == 0) {
                        obj.w = pic.width;
                        obj.h = pic.height;
                        console.warn('b类--1------');
                    } else if (ratio > 0) {
                        obj.h = pic.height;
                        obj.w = pic.height * ratio_sprite
                        obj.x = (obj.w - pic.width) / 2;
                        console.warn('b类--2------')
                    } else if (ratio < 0) {
                        obj.w = pic.width;
                        obj.h = pic.width / ratio_sprite;
                        obj.y = (obj.h - pic.height) / 2;
                        console.warn('b类--3------')
                    }
                } else if (ratio_img < 1) {
                    console.warn('c类--------');
                    if (ratio == 0) {
                        obj.w = pic.height;
                        obj.h = pic.height;
                        console.warn('c类--1------')
                    } else if (ratio > 0) {
                        console.warn('c类--2------')
                        if (ratio_sprite > 1) {
                            console.warn('c类--2-1-----')
                            obj.h = pic.height;
                            obj.w = pic.height * ratio_sprite
                            obj.x = (obj.w - pic.width) / 2;
                        } else {
                            console.warn('c类--2-2-----')
                            obj.h = pic.height;
                            obj.w = pic.height * ratio_sprite
                            obj.x = (obj.w - pic.width) / 2;
                        }
                    } else if (ratio < 0) {
                        obj.w = pic.width;
                        obj.h = pic.width / ratio_sprite;
                        obj.y = (obj.h - pic.height) / 2;
                        console.warn('c类--3------')
                    }
                }
            }

            obj.w = parseInt(obj.w)
            obj.h = parseInt(obj.h)
            obj.x = parseInt(obj.x)
            obj.y = parseInt(obj.y)
            console.warn('d类-------', obj)
            return obj
        }


        function drawAvatar(pic) {
            /*
            var pic={
                url:''; // 图片链接
                width:20,// 展示的宽度(如果是画圆形 drawType: 'circle' 的时候,对比 pic.width 和 pic.height , 取最小值作为圆直径  )
                height:30,// 展示的高度(如果是画圆形 drawType: 'circle' 的时候,对比 pic.width 和 pic.height , 取最小值作为圆直径  )
                radius: 50,// 圆半径 (如果是画圆形 drawType: 'circle' 的时候, pic.radius 做为半径,  pic.width 和 pic.height 都回无效  )
                center_x: 220,// 中心点x 位置
                center_y: 320,// 中心点y 位置
                drawType: 'circle', // 画图的形状类型,参数有 : 'circle' || 'rect' || 'roundedRect'
            }
        
             */
            let spriteObj = PIXI.Sprite.from(pic.url);
            spriteObj.anchor.set(0, 0);
            let sprite_w = spriteObj.width, sprite_h = spriteObj.height;
            let circle_r;
            if (pic.drawType == 'circle') {
                if (pic.radius) {
                    circle_r = pic.radius
                } else {
                    pic.width > pic.height ? circle_r = pic.height / 2 : circle_r = pic.width / 2;
                }
                pic.width = circle_r * 2
                pic.height = circle_r * 2
            }
            // resize avatar 
            let resize_avatar = { sprite_w: spriteObj.width, sprite_h: spriteObj.height, ...pic, }
            let scale_size = setPicScale(resize_avatar);

            spriteObj.width = scale_size.w;
            spriteObj.height = scale_size.h;
            spriteObj.x = pic.center_x - spriteObj.width / 2
            spriteObj.y = pic.center_y - spriteObj.height / 2

            // 画蒙版图形 s
            let masking = new PIXI.Graphics();
            let mask_x = pic.center_x - pic.width / 2,
                mask_y = pic.center_y - pic.height / 2;
            masking.beginFill(0x66CCFF, .5);//背景色

            if (pic.drawType == 'rect') {
                console.warn('p1--');
                masking.drawRect(mask_x, mask_y, pic.width, pic.height);
            } if (pic.drawType == 'roundedRect') {
                console.warn('p1--');
                masking.drawRoundedRect(mask_x, mask_y, pic.width, pic.height, pic.rounde_deg || 10);
            } else if (pic.drawType == 'circle') {
                console.warn('-----------cut----------');
                // drawCircle
                mask_x = pic.center_x
                mask_y = pic.center_y
                masking.drawCircle(mask_x, mask_y, circle_r); // 圆心的 X 坐标,圆心的 y 坐标,半径
            }
            masking.endFill();
            spriteObj.mask = masking;
            // 画蒙版图形 e
            return [spriteObj, masking]
        }
        // ---------------------- 开始

        let my_container = document.querySelector('#pixiCantainer')

        let htmlFontSize = parseFloat(document.querySelector('html').style.fontSize)
        console.log(htmlFontSize, 'htmlFontSize是');
        let ui_width = 750
        let start_y = 20
        // 启动app
        const app = new PIXI.Application({
            background: '#fcf',
            // resizeTo: window,
            width: ui_width,
            antialias: true,//抗锯齿功能开启,默认不开,开了会比较消耗性能
            // height: 700,
        });
        let children_list = []

        my_container.appendChild(app.view);

        let pic_data = {
            frame_bg: 'https://image.whoisamy.shop/action/commonPics/23_08_11_groupPurchase/page_bg.png',
            frame_top: 'https://image.whoisamy.shop/action/commonPics/23_08_11_groupPurchase/fra_top.png',
            frame_mid: 'https://image.whoisamy.shop/action/commonPics/23_08_11_groupPurchase/fra_mid.png',
            frame_bot: 'https://image.whoisamy.shop/action/commonPics/23_08_11_groupPurchase/fra_bot.png',
            avatar_1: "https://th.bing.com/th/id/R.b49dbddffaa692d75988e0c5882dacca?rik=r6IIYs2muimY7A&riu=http%3a%2f%2fwww.quazero.com%2fuploads%2fallimg%2f140529%2f1-140529145A4.jpg&ehk=Co9XURYRCjJXUTzFG0Mw6lD7olzDKceEgv3slEC8kvQ%3d&risl=&pid=ImgRaw&r=0",
            avatar_2: "https://img.zcool.cn/community/0104c15cd45b49a80121416816f1ec.jpg@1280w_1l_2o_100sh.jpg",
            avatar_3: "https://pic2.zhimg.com/255de7c1e56c1ab09329885d85d2c16a_r.jpg?source=1940ef5c",
        }

        let pic_arr = []
        for (const key in pic_data) {
            if (Object.hasOwnProperty.call(pic_data, key)) {
                const element = pic_data[key];
                pic_arr.push(element)
            }
        }


        let loader = app.loader,
            // resources = app.loader.resources,
            Sprite = PIXI.Sprite;



        // pic 1 s  背景图
        const bunny_1 = PIXI.Sprite.from(pic_data.frame_bg);
        bunny_1.anchor.set(0, 0);
        // bunny_2.x = app.screen.width / 2 - bunny_2.width / 2;
        bunny_1.x = app.screen.width / 2 - (702 - 20) / 2;
        bunny_1.y = start_y + 20 - 14;
        bunny_1.width = 702 - 16;
        bunny_1.height = 500 + 30;
        // app.stage.addChild(bunny_2);
        // pic 1 e

        // pic 2 s 头边框
        const bunny_2 = PIXI.Sprite.from(pic_data.frame_top);
        bunny_2.anchor.set(0, 0);
        // bunny_2.x = app.screen.width / 2 - bunny_2.width / 2;
        bunny_2.x = app.screen.width / 2 - 702 / 2;
        bunny_2.y = start_y;
        // pic 2 e

        // pic 3 s 中边框
        const bunny_3 = PIXI.Sprite.from(pic_data.frame_mid);
        bunny_3.anchor.set(0, 0);
        bunny_3.height = 400
        bunny_3.x = app.screen.width / 2 - 702 / 2;
        bunny_3.y = 71 + start_y;
        // pic 3 e

        // pic 4 s 底边框
        const bunny_4 = PIXI.Sprite.from(pic_data.frame_bot);
        bunny_4.anchor.set(0, 0);
        bunny_4.x = app.screen.width / 2 - 702 / 2;
        bunny_4.y = 400 + start_y + 71;
        // pic 4 e


        const style = new PIXI.TextStyle({
            fontFamily: 'Arial',
            fontSize: 36,
            fontStyle: 'italic',
            fontWeight: 'bold',
            fill: ['#ffffff', '#00ff99'], // gradient
            stroke: '#4a1850',
            strokeThickness: 5,
            dropShadow: true,
            dropShadowColor: '#000000',
            dropShadowBlur: 4,
            dropShadowAngle: Math.PI / 6,
            dropShadowDistance: 6,
            wordWrap: true,
            wordWrapWidth: 440,
            lineJoin: 'round',
        });

        const richText = new PIXI.Text('Rich text with a lot of options and across multiple lines', style);

        richText.x = 50;
        richText.y = 220;


        // 

        // app.stage.addChild(rectangle);



        let rectangle = new PIXI.Graphics();
        rectangle.lineStyle(4, 0xFF3300, 1);
        rectangle.beginFill(0x66CCFF);
        rectangle.drawRect(0, 0, 64, 64);
        rectangle.endFill();
        rectangle.x = 70;
        rectangle.y = 70;

        let circle = new PIXI.Graphics();
        circle.beginFill(0x9966FF);
        circle.drawCircle(0, 0, 32);
        circle.endFill();
        circle.x = 84;
        circle.y = 130;

        // 画头像 s
        // function drawAvatar(url) {
        //     let imgbase64;
        //     let cvs = document.createElement('canvas')
        //     cvs.setAttribute('class','avatarCanvas')
        //     cvs.style.cssText = "position:absolute;left:0;top:0;z-index:-1"
        //     // 

        // 填充图片到形状中 (蒙版) s ------------
        //创建精灵
        // let Pikachu = new PIXI.Sprite(PIXI.loader.resources[pic_data.avatar_1].texture);
        let Pikachu = PIXI.Sprite.from(pic_data.avatar_1);

        //创建一个正方形对象
        let rectangle_2 = new PIXI.Graphics();
        rectangle_2.beginFill(0x66CCFF);
        rectangle_2.drawRect(0, 0, 200, 200);
        rectangle_2.endFill();
        rectangle_2.x = 300;
        rectangle_2.y = 300;

        //给精灵设置蒙版
        Pikachu.mask = rectangle_2;

        // *-*
        // ---------
        let avatar_cp = { y: 160, x: 270, }
        let avatar_cp_1 = drawAvatar({
            url: pic_data.avatar_1,
            // url: pic_data.avatar_2,
            // url: pic_data.avatar_3,
            width: 200,
            height: 180,
            // objectFit: 'cover',
            // drawType: 'rect',
            drawType: 'roundedRect',
            // drawType: 'circle',
            center_x: avatar_cp.x,//中心点x
            center_y: avatar_cp.y,//中心点y
            radius: 100,//半径
            rounde_deg: 40,
            // lineStyle: "4, 0xFF3300, 1"
        })
        let avatar_cp_2 = drawAvatar({
            // url: pic_data.avatar_1,
            url: pic_data.avatar_2,
            // url: pic_data.avatar_3,
            width: 200,
            height: 200,
            // objectFit: 'cover',
            drawType: 'circle',
            // drawType: 'rect',
            center_x: avatar_cp.x + 300,//中心点x
            center_y: avatar_cp.y,//中心点y
            radius: 100,//半径
            // lineStyle: "4, 0xFF3300, 1"
        })

        let avatar_list = [...avatar_cp_1, ...avatar_cp_2]
        // console.log(myAvatar, '[myAvatar是]');

        // 头像1 e

        // 填充图片到形状中 (蒙版) e ------------

        // 画头像 e
        children_list = [bunny_1, bunny_4, bunny_3, bunny_2, richText, rectangle, circle, rectangle_2, ...avatar_list]
        console.log(children_list, 'children_list 是');

        app.stage.addChild(...children_list);



    </script>
</body>

</html>

标签:obj,头像,pic,js,width,pixi,let,height,bunny
From: https://www.cnblogs.com/janty/p/17691592.html

相关文章

  • Golang 初识: 函数调用与定义丶字符串处理丶Json的处理
    一.基本函数调用与定义1packagemain23import(4"encoding/json"5"errors"6"fmt"7"math/rand"8"mylib/pkg/student"9"mylib/pkg/utils"10"sort"11......
  • Node.js+Express+Koa2开发接口学习笔记(二)
    搭建开发环境从0开始搭建,不适用任何框架使用nodemon监测文件变化,自动重启node使用cross-env设置环境变量,兼容maxlinux和windows创建项目文件夹blog-1,在终端输入命令npminit-y在根目录下创建bin=>www.js文件,将初次运行的文件www.js存放在bin目录下。同时需要修改pack......
  • 使用Node.js和Express.js构建RESTful API
    Express.js简介Express.js是一个流行的Node.jsWeb应用程序框架,它提供了用于构建Web和API应用程序的核心功能。Express.js是一个轻量级、快速和灵活的框架,让你能够轻松处理路由、请求和响应。以下是一些关键Express.js特点:路由:Express.js允许你定义HTTP路由,以便处理不同的URL请求。......
  • 使用Node.js和MongoDB构建RESTful API
    Node.js和Express.js简介Node.js是一个流行的服务器端JavaScript运行环境,用于构建高性能的网络应用程序。Express.js是一个Node.js的Web应用程序框架,它提供了用于创建Web和API应用程序的核心功能,如路由、中间件和HTTP请求处理。以下是一些关键Node.js和Express.js特点:非阻塞和事件......
  • 较真:js判断中文字符串长度的正确方法
    对于使用javascript编程的人来说,判断字符串长度应该是常用又简单的操作,但在判断包含有中文字符或其他非asci字符的字符串长度时,却有些坑在里面。错误做法1先看看最常用的做法,也就是使用String.length判断:letstr="你好奥";letlen=str.length;console.log(len);//打印出来......
  • postgresql数据库安装日志解析插件wal2json
    postgresql数据库安装日志解析插件wal2json一、编译安装wal2json插件cdwal2jsonexportPATH=/data/home/fei.yang4/moudle/postgresql/bin:$PATHmakemakeinstall二、直接导入wal2json插件查看pg进程确定pgsql库和配置文件存放目录ps-ef|greppostgresqlubuntu24975248......
  • Vue.js 官方脚手架 create-vue 是怎么实现的?
    Vue.js官方脚手架create-vue是怎么实现的?摘要本文共分为四个部分,系统解析了vue.js官方脚手架create-vue的实现细节。第一部分主要是一些准备工作,如源码下载、项目组织结构分析、依赖分析、功能点分析等;第二部分分析了create-vue脚手架是如何执行的,执行文件的生成细节......
  • 原生JavaScript框架设计(一):整合JS函数
    本篇为回顾js时总结,诣在整理JS中常用知识点,剖析其规律。模仿jQuery,简单一些,特定功能,像apply函数、getElementXXX函数等浏览器函数都没有实现,直接套用。创建common.js://自定义实现push函数varmyPush=function(target,els){ varj=target.length, i=0; while((target[j++]=e......
  • chrome插件:content.js、background.js, options.js, popup.js之间的通信
    目录content.js向background.js发送消息background.js向content.js发送消息options.js或popup.js向background.js传递数据总结content.js向background.js发送消息消息方向://content.js一般不直接与options.js,popup.js通信,而是与常驻的background.js通信content.js=>[back......
  • nodejs采集淘宝、天猫网商品详情数据以及解决_m_h5_tk令牌及sign签名验证(2023-09-09)
    一、淘宝、天猫sign加密算法淘宝、天猫对于h5的访问采用了和APP客户端不同的方式,由于在h5的js代码中保存appsercret具有较高的风险,mtop采用了随机分配令牌的方式,为每个访问端分配一个token,保存在用户的cookie中,通过cookie带回服务端分配的token,客户端利用分配的token对请求的URL......