Android之 颜色选择器

news2024/11/10 10:39:19

一,简介

1.1 计算机的颜色通常有两种表示方式:

光源模式RGB(Red=红, Green=绿, Blue=蓝),数值0-255

印刷模式CMYK(Cyan=青, Magenta=品红, Yellow=黄, Black=黑),数值1-100

任何颜色都是由RGB或CMYK混合出来的,再加上透明度的变化,就是我们所能看到的全部颜色

1.2 HSV 模式(色相,饱和度,明度)

H(hue)代表色相:在0~360°的标准色轮上,色相是按位置度量的。在通常的使用中,色相是由颜色名称标识的,比如红、绿或橙色。黑色和白色无色相。

S(saturation)表示饱和度:表示色彩的纯度,为0时为灰色。白、黑和其他灰色色彩都没有饱和度的。在最大饱和度时,每一色相具有最纯的色光。取值范围0~100%。数值越大,颜色中的灰色越少,颜色越鲜艳,呈现一种从灰度到纯色的变化。

V(value)表示明度度:其作用是控制色彩的明暗变化。它同样使用了 0% 至 100% 的取值范围。数值越小,色彩越暗,越接近于黑色;数值越大,色彩越亮,越接近于白色。

1.3 颜色的表示方式十进制

ARGB(透明度,红,绿,蓝)

白色:rgb(255,255,255)

 黑色:rgb(0,0,0)

 红色:rgb(255,0,0)

 绿色:rgb(0,255,0)

 蓝色:rgb(0,0,255)

 青色rgb(0,255,255)

 紫色:rgb(255,0,255)

1.4 颜色的表示方式十六进制

0 1 2 3 4 5 6 7 8 9 a b c d e f

00表示没有,相当于rgb中的0

ff表示最大,相当于rgb中255

白色:rgb(FFFFFF)

 黑色:rgb(00000)

 红色:rgb(FF0000)

 绿色:rgb(00FF00)

 蓝色:rgb(0000FF)

 青色rgb(00FFFF)

 紫色:rgb(FF00FF)

 二 常用的选择器

2.1 方块选择器,RGB选择器也是最常用选择器

x轴方向是色相(0~360°),y轴方向是亮度(0-100%)

这里面有几个概念:

RGB(0-255),我们最终赋给控件的颜色

HSV(色相,饱和度,明度),一张图片的颜色范围,下面的其实也是一张图片

XY坐标(颜色在图片的坐标位置),比如我们点击一个位置,要先获取坐标。

转换关系:

RGB转坐标比如我们需要定位颜色在选择器上的位置

第一步,RGB转HSV

//RGB颜色
int color = Color.rgb(RGBArray[1], RGBArray[2], RGBArray[3]);
//HSV颜色数组
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
//色相
float hue = hsv[0];
//饱和度
float saturation = hsv[1];
//明度
float value= hsv[2];

第二步,HSV转坐标

//x坐标表示色相(范围0-360),把选择器宽度平分360份,也就是360个轴,x=选择器宽度/360*当前的色相
int x = (int) colorPickerWidth / 360f * hue;
//y坐标表示饱和度,范围0-100),把选择器高度平分100份,也就是100个轴,y=选择器高度/100*当前的饱和度
int y = (int) colorPickerHeight - colorPickerHeight / 100f * saturation;
//设置选择器标点的坐标位置
colorPickerView.setCoordinate(x, y);

坐标转RGB比如点击色盘上一个位置,需要获取整个位置的颜色值

第一步坐标转HSV,这里需要一个三角函数反正切公式,

//获取xy中心点坐标
x = x - getWidth() * 0.5f;
y = y - getHeight() * 0.5f;
//勾股定理,求斜边边长,求根公式Math.sqrt(x的平方+y的平方)
double r = Math.sqrt(x * x + y * y);
//半径
float radius = Math.min(getWidth(), getHeight()) * 0.5f;
//定义hsv数组
float[] hsv = {0, 0, 1};
//求角度
hsv[0] = (float) (Math.atan2(y, -x) / Math.PI * 180f) + 180;
//求明度
hsv[1] = Math.max(0f, Math.min(1f, (float) (r / radius)));

第二步,hsv转RGB

//HSV转颜色
Color.HSVToColor(hsv);
 /** 颜色转十六进制 比如#FFFFFF*/
  public static String getHexCode(@ColorInt int color) {
    int a = Color.alpha(color);
    int r = Color.red(color);
    int g = Color.green(color);
    int b = Color.blue(color);
    return String.format(Locale.getDefault(), "%02X%02X%02X%02X", a, r, g, b);
  }

  /** 颜色转RGB数组,比如(255,255,255) */
  public static int[] getColorARGB(@ColorInt int color) {
    int[] argb = new int[4];
    argb[0] = Color.alpha(color);
    argb[1] = Color.red(color);
    argb[2] = Color.green(color);
    argb[3] = Color.blue(color);
    return argb;
  }

 2.2 圆盘选择器

 

 跟方块选择器差不多

色相0-360°,0从顶部开始

明度0-100%,0从中心开始

颜色转hsv就不多说了,下面是hsv转坐标

//圆形选择器的宽高
colorPickerWidth = colorPickerView.getMeasuredWidth();
colorPickerHeight = colorPickerView.getMeasuredHeight();
//圆形的便半径
float centerX = colorPickerWidth * 0.5f;
float centerY = colorPickerHeight * 0.5f;
//当前明度距离圆形的长度=明度(50%)*选择器圆形半径
float radius = hsvArray[1] * Math.min(centerX, centerY);
//根据明度的半径和色相的角度,计算出颜色所在的坐标
//即三角函数,已知边长和圆角,计算坐标
int pointX = (int) (radius * Math.cos(Math.toRadians(90 - hsvArray[0])) + centerX);
int pointY = (int) (-radius * Math.sin(Math.toRadians(90 - hsvArray[0])) + centerY);

坐标转颜色

当然可以把上面步骤反向一下,也有个快捷方式,我们知道计算中的图片其实都是有像素组成的,每个像素就是一种颜色,所以图片可以说本来就是有颜色构成的。

我们只要获取坐标点所在的像素就能或者这个像素的颜色,比如获取第一个像素

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_200x200);
int color_0_0 = bitmap.getPixel(0, 0);//获取第1行,第1个像素颜色

 2.3 XY选择器,cie-xy色度图,也称舌形图

坐标范围

X: 0.1600 – 0.6800
Y: 0.0700 – 0.6900

 这种是最复杂的一个,需要把选择范围限制在黑色三角形之内,这就需要用到高数种的一个公式,判断任意一点是否在三角形内。

面积算法法:如果一个点在三角形内,其与三角形的三个点构成的三个子三角形的面积等于大三角形的面积。否则,大于大三角形的面积。所以,这个问题就转化成如何在知道三角形的三个点的情况下,求这个三角形的面积的问题了。

方式一,首先可以计算出每条边的长度及周长,我们就可以利用海伦公式计算面积,然后进行比较。

 方式二,向量法,先求出这个三角形的对应的平行四边形的面积。然后这个面积的1/2就是三角形的面积了。

先随意选择两个点,如B、C通过其坐标相减得向量(B,C)。记得谁减另一个就是指向谁。然后求出其中一个点和剩下一个点的向量。这两个向量的叉乘的便是平行四边形的面积。除以2就是三角形的面积。(注意这里是叉乘 (cross product),而非点乘(dot product))。

向量之间的积分为两种:叉乘和点乘。叉乘求面积,点乘求投影。这是两者的意义。而且,叉乘理论得到的是一个向量,而点乘得到的是一个标量。

在这里插入图片描述

在这里插入图片描述

 实践源码:


    //更新x坐标色温位置
    private void updateColorXPick() {
        if (!isColorXListener) {
            colorPickerX = colorPickerWidth / 8000f * seekbarAxisX.getProgress();
            int selectX = (int) colorPickerX;
            int selectY = (int) colorPickerY;


            //计算坐标是否超出三角形范围,如果超出需要沿着边线运动
            float xValue = Float.parseFloat(tvAxisX.getText().toString());
            float yValue = Float.parseFloat(tvAxisY.getText().toString());
            POINT p = new POINT(xValue, yValue);
            if (isOutGB(p)) {
                //y=kx+b
                float k = GB_KB()[0];
                float b = GB_KB()[1];
                float y = k * xValue + b;
                colorPickerY = colorPickerHeight - (colorPickerHeight / 9000f * (y * 10000f));
                selectY = (int) colorPickerY;

                seekbarAxisY.setProgress(y * 10000f);
            }

            if (isOutGR(p)) {
                //y=kx+b
                float k = GR_KB()[0];
                float b = GR_KB()[1];
                float y = k * xValue + b;
                colorPickerY = colorPickerHeight - (colorPickerHeight / 9000f * (y * 10000f));
                selectY = (int) colorPickerY;

                seekbarAxisY.setProgress(y * 10000f);
            }
            if (isOutBR(p)) {
                //y=kx+b
                float k = BR_KB()[0];
                float b = BR_KB()[1];
                float y = k * xValue + b;
                colorPickerY = colorPickerHeight - (colorPickerHeight / 9000f * (y * 10000f));
                selectY = (int) colorPickerY;

                seekbarAxisY.setProgress(y * 10000f);
            }

            colorPickerView.setCoordinate(selectX, selectY);
            Point snapPoint = PointMapper.getColorPoint(colorPickerView, new Point(selectX, selectY));
            int pixelColor = colorPickerView.getColorFromBitmap(snapPoint.x, snapPoint.y);
            ColorEnvelope envelope = new ColorEnvelope(pixelColor);
            GradientDrawable myShape = (GradientDrawable) viewColorBg.getBackground();
            selectedColor = envelope.getColor();
            myShape.setColor(selectedColor);
        }
    }

    //更新y坐标色温位置
    private void updateColorYPick() {
        if (!isColorYListener) {
            colorPickerY = colorPickerHeight - (colorPickerHeight / 9000f * seekbarAxisY.getProgress());
            int selectX = (int) colorPickerX;
            int selectY = (int) colorPickerY;

            //计算坐标是否超出三角形范围,如果超出需要沿着边线运动
            float xValue = Float.parseFloat(tvAxisX.getText().toString());
            float yValue = Float.parseFloat(tvAxisY.getText().toString());
            POINT p = new POINT(xValue, yValue);
            if (isOutGB(p)) {
                //y=kx+b
                //x=(y-b)/k
                float k = GB_KB()[0];
                float b = GB_KB()[1];
                float x = (yValue - b) / k;
                colorPickerX = colorPickerWidth / 8000f * (x * 10000f);
                selectX = (int) colorPickerX;
                seekbarAxisX.setProgress(x * 10000f);
            }

            if (isOutGR(p)) {
                //y=kx+b
                //x=(y-b)/k
                float k = GR_KB()[0];
                float b = GR_KB()[1];
                float x = (yValue - b) / k;
                colorPickerX = colorPickerWidth / 8000f * (x * 10000f);
                selectX = (int) colorPickerX;
                seekbarAxisX.setProgress(x * 10000f);
            }
            if (isOutBR(p)) {
                //y=kx+b
                //x=(y-b)/k
                float k = BR_KB()[0];
                float b = BR_KB()[1];
                float x = (yValue - b) / k;
                colorPickerX = colorPickerWidth / 8000f * (x * 10000f);
                selectX = (int) colorPickerX;
                seekbarAxisX.setProgress(x * 10000f);
            }


            colorPickerView.setCoordinate(selectX, selectY);
            Point snapPoint = PointMapper.getColorPoint(colorPickerView, new Point(selectX, selectY));
            int pixelColor = colorPickerView.getColorFromBitmap(snapPoint.x, snapPoint.y);
            ColorEnvelope envelope = new ColorEnvelope(pixelColor);
            GradientDrawable myShape = (GradientDrawable) viewColorBg.getBackground();
            selectedColor = envelope.getColor();
            myShape.setColor(selectedColor);
        }
    }

    //判断是否在GB线的外面
    private boolean isOutGB(POINT p) {
        POINT a = new POINT(pointRect1[0], pointRect1[1]);
        POINT b = new POINT(pointB[0], pointB[1]);
        POINT c = new POINT(pointG[0], pointG[1]);
        return isInTriangle(a, b, c, p);
    }

    //判断是否在BG线的外面
    private boolean isOutGR(POINT p) {
        POINT a = new POINT(pointRect2[0], pointRect2[1]);
        POINT c = new POINT(pointG[0], pointG[1]);
        POINT b = new POINT(pointR[0], pointR[1]);
        return isInTriangle(a, b, c, p);
    }

    //判断是否在BR线的外面
    private boolean isOutBR(POINT p) {
        POINT a = new POINT(pointRect3[0], pointRect3[1]);
        POINT b = new POINT(pointB[0], pointB[1]);
        POINT c = new POINT(pointR[0], pointR[1]);
        return isInTriangle(a, b, c, p);
    }

    /**
     * 中心法判断点p是否在一个三角形内
     *
     * @param p
     * @param a
     * @param b
     * @param c
     * @return
     */
    private static boolean isInTriangle(POINT a, POINT b, POINT c, POINT p) {
        POINT AB, AC, AP;
        AB = new POINT(b.x - a.x, b.y - a.y);
        AC = new POINT(c.x - a.x, c.y - a.y);
        AP = new POINT(p.x - a.x, p.y - a.y);
        float dot00 = dotProduct(AC, AC);
        float dot01 = dotProduct(AC, AB);
        float dot02 = dotProduct(AC, AP);
        float dot11 = dotProduct(AB, AB);
        float dot12 = dotProduct(AB, AP);
        float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01);
        // 计算重心坐标
        float u = (dot11 * dot02 - dot01 * dot12) * inverDeno;
        float v = (dot00 * dot12 - dot01 * dot02) * inverDeno;
        return (u >= 0) && (v >= 0) && (u + v < 1);
    }

    //求GB坐标线的KB
    private float[] GB_KB() {
        return calculationKB(pointG[0], pointG[1], pointB[0], pointB[1]);
    }

    //求GR坐标线的KB
    private float[] GR_KB() {
        return calculationKB(pointG[0], pointG[1], pointR[0], pointR[1]);
    }

    //求BR坐标线的KB
    private float[] BR_KB() {
        return calculationKB(pointB[0], pointB[1], pointR[0], pointR[1]);
    }


    /**
     * 线性代数求k和b
     * 已知两点坐标
     * y=kx+b
     * y1=kx1+b
     *
     * @param point1X
     * @param point1Y
     * @param point2X
     * @param point2Y
     */
    private float[] calculationKB(float point1X, float point1Y, float point2X, float point2Y) {
        float k = (point2Y - point1Y) / (point2X - point1X);
        float b = point1Y - point1X * k;
        float[] kb = new float[]{k, b};
        return kb;
    }


    private static float dotProduct(POINT p1, POINT p2) {
        return p1.x * p2.x + p1.y * p2.y;
    }

 2.4 图片颜色选择器

任何一张图片,点击任何位置都可以提取当前位置颜色,类似于ps中的吸管工具

这个其实最简单的,上面有讲过,任何图片都是由像素颜色组成的,获取像素点就能获取颜色,可以参考上面,传入像素坐标

bitmap.getPixel(0, 0);//获取第1行,第1个像素颜色

2.5 色温选择器

色温介绍

色温是一种衡量温度
方法,使用这种方法标定的色温与普通大众所认为的“暖”和“冷”正好相反,例如,通常人们会感觉红色.橙色和黄色较暖,白色和蓝色较冷,而实际上红色的色温最低,然后逐步增加的是橙色、黄色、白色和蓝色,蓝色是最高的色温

光源色温不同,带来的感觉也不相同。高色温光源照射下.如亮度不高就会给人们一种阴冷的感觉;低色温光源照射下,亮度过高则会给人们一种闷热的感觉。色温越低,色调越暖(偏红);色温越高,色调越冷(偏蓝)

<3000K

温暖(带红的白色)

稳重、温暖

3000-5000K

中间(白色)

爽快

>5000K

清凉型(带蓝的白色)

色纸与色温的关系

色纸按两种类提供数据
一种是HSI数值,然后根据HUE和SAT计算出对应的数值
另一种是提供坐标点,根据坐标点在坐标体系中提取对应的数值


HSI数值,可以参考RGB颜色

色纸名称      5600K数值         3200K数值
Red 90       HUE 11  SAT 92  - HUE 6    SAT 85
Red 60       HUE 17  SAT 86  - HUE 15   SAT 70
Red 30       HUE 17  SAT 58  - HUE 13   SAT 50
Red 15       HUE 17  SAT 20  - HUE 13   SAT 30

Green 90     HUE 104 SAT 93  - HUE 85   SAT 100
Green 60     HUE 95  SAT 80  - HUE 100  SAT 70
Green 30     HUE 95  SAT 70  - HUE 90   SAT 40
Green 15     HUE 95  SAT 40  - HUE 95   SAT 14

Blue 90      HUE 230 SAT 87  - HUE 250  SAT 60
Blue 60      HUE 215 SAT 60  - HUE 240  SAT 35
Blue 30      HUE 206 SAT 33  - HUE 240  SAT 10
Blue 15      HUE 195 SAT 15  - HUE 240  SAT  7

Cyan 90      HUE 150 SAT 75  - HUE 140  SAT 80
Cyan 60      HUE 145 SAT 65  - HUE 140  SAT 55
Cyan 30      HUE 145 SAT 35  - HUE 150  SAT 25
Cyan 15      HUE 153 SAT 20  - HUE 160  SAT 15
Cyan 7       HUE 155 SAT 15  - HUE 160  SAT 7

Magenta 90   HUE 330 SAT 80  - HUE 345  SAT 85
Magenta 60   HUE 330 SAT 70  - HUE 345  SAT 70
Magenta 30   HUE 330 SAT 43  - HUE 340  SAT 45
Magenta 15   HUE 330 SAT 18  - HUE 340  SAT 23

Yellow 90    HUE 60  SAT 98  - HUE 45   SAT 100
Yellow 60    HUE 60  SAT 92  - HUE 45   SAT 90
Yellow 30    HUE 63  SAT 75  - HUE 42   SAT 65
Yellow 15    HUE 63  SAT 50  - HUE 35   SAT 45

Pink 90      HUE 0   SAT 80  - HUE 355  SAT 75
Pink 60      HUE 350 SAT 60  - HUE 355  SAT 60
Pink 30      HUE 345 SAT 35  - HUE 355  SAT 45
Pink 15      HUE 345 SAT 15  - HUE 355  SAT 25

Lavender 90  HUE 285 SAT 85  - HUE 325  SAT 70
Lavender 60  HUE 285 SAT 65  - HUE 328  SAT 45
Lavender 30  HUE 285 SAT 35  - HUE 332  SAT 30
Lavender 15  HUE 285 SAT 10  - HUE 332  SAT 30

坐标数值:可以参考XY色盘模式,这个坐标其实也就是xy色盘坐标       

色纸名称            5600K数据             3200K数据
DOUBLE CTB   - 0.2785,0.2858    - 0.2952,0.3048
FULL CTB         - 0.2952,0.3048    - 0.3302,0.3391
1/2 CTB             - 0.2972,0.3069    - 0.3644,0.3661
1/4 CTB             - 0.3105,0.3207    - 0.4053,0.3907
1/8 CTB             - 0.3221,0.3318    - 0.3221,0.3318
DOUBLE CTO   - 0.5780,0.4058    - 0.5834,0.4100
FULL CTO         - 0.4234,0.3990    - 0.5712,0.4001
1/2 CTO             - 0.3644,0.3661    - 0.5267,0.4133
1/4 CTO             - 0.3451,0.3516    - 0.4683,0.4123
1/8 CTO             - 0.3372,0.3451    - 0.4443,0.4065

2.6 色温线

XY模式色盘的弓形线”就是色温线,标有色温

最左边的直线,是色温“无穷大”等温线,再左边(兰色区)就无色温了。
1000K左右偏红色,1500K到3000K偏黄色,以后黄色越来越淡,4500K起蓝色逐步增加,10000K后颜色带青

三 色盘选择库

推荐一个选择器库:https://github.com/skydoves/ColorPickerView

支持方形,圆形,和图片选择颜色,有兴趣可以参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年产业基金研究报告

第一章 行业概况 1.1 概述 产业基金&#xff0c;又称为产业投资基金&#xff0c;是一种由政府、企业、金融机构等出资设立的&#xff0c;专门用于支持和促进特定产业发展的投资基金。产业基金通常以股权投资和长期投资为主&#xff0c;旨在推动产业结构升级、促进科技创新、提…

算法刷题|139.单词拆分、多重背包

单词拆分 题目&#xff1a;给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 思路&#xff1a;字符串s就是我们的背包…

【移动端网页布局】流式布局案例 ① ( 视口标签设置 | CSS 样式文件设置 | 布局宽度设置 | 设置最大宽度 | 设置最小宽度 )

文章目录 一、视口标签设置二、CSS 样式文件设置三、布局宽度设置1、设置布局宽度2、设置布局最大宽度3、设置布局最小宽度4、查看网页最大最小宽度5、布局宽度设置 四、代码示例1、主界面标签2、CSS 布局设置 一、视口标签设置 参考 【移动端网页布局】移动端网页布局基础概念…

打造卓越游戏 | 2023 Google 游戏开发者峰会

一款游戏从初始构想的开发到辉煌赛季的策划&#xff0c;开发者们每时每刻都在倾注心血潜心钻研&#xff0c;Google 也致力于在整个开发和发布生命周期中为您提供帮助。我们很高兴能在今年如约而至的 Google 游戏开发者峰会中与您分享诸多更新&#xff0c;展示我们为助力您打造精…

JavaScript常用方法整理

文章目录 前言1.栈方法&#xff1a;push()、pop()2.队列方法&#xff1a;unshift()、shift()3.indexof()、lastIndexOf()、includes()4.操作方法&#xff1a;concat()、slice()、splice()5.Array.isArray()6.排序方法:sort()、reverse()7.转换方法&#xff1a;toString()、join…

input 元素 change 事件失效,失去焦点的时候才执行?什么原因导致?如何正确使用?

具体问题如标题所示&#xff0c;不再过多水字数&#xff0c;请看下面的代码&#xff1a; <input :class"[custom-form-item-input, (isFocusUserName && !userName) ? custom-form-item-input-err-active : ]"autoCompletenew-password type"text&…

带着疑问学C语言-C语言常用变量

目录 目录 一、声明变量和定义变量的区别是什么&#xff1f; 二、什么常量&#xff0c;如何区分常量和变量&#xff1f; 三、各数据类型所占的内存是多少&#xff1f; 四、字符与字符串的差别有哪些&#xff1f; 五、为什么会发生数据溢出&#xff0c;如何避免数据溢出&am…

springboot整合juit和springboot整合mybatis和springboot整合ssm

springboot整合juit 先看一眼包路径&#xff0c;发现main程序的路径和测试类的路径是一样的 启用新注解&#xff1a;SpringBootTest代替了之前sm整合juit时的 RunWith(SpringJUnit4ClassRunner.class) //spring配置类 ContextConfiguration(classes config.class)新的如此…

数字北京城,航行在联通2000M的“大运河”

前故宫博物院院长单霁翔&#xff0c;在《大运河漂来紫禁城》一书中提到过&#xff0c;紫禁城里的石材、木材&#xff0c;甚至每一块砖&#xff0c;都是通过大运河&#xff0c;跋山涉水来到北京的。某种程度上说&#xff0c;北京城的繁荣与这条纵跨南北的“中华大动脉”密不可分…

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻&#xff0c;因为我们即将能生产出令人惊叹的3D效果&#xff01; 变换 向量和矩阵变换包括太多内容&#xff0c;但由于学过线性代数和GAMES101&#xff0c;因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 &#xff08;1&#xff09;GLM…

拓扑排序例题 P4017 最大食物链计数

拓扑排序例题 P4017 最大食物链计数 题目链接&#xff1a;P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是重…

陆奇博士4月23日深圳奇绩创坛分享会PPT及核心观点:新范式、新时代、新机遇(附PPT下载链接)...

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 【限时免费】ChatGPT4体验&#xff0c;无需翻墙直接用 ChatGPT调研报告&#xff08;仅供内部参考&#xff09; ChatGPT的发展历程、原理、技术架构…

记录-使用双token实现无感刷新,前后端详细代码

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 近期写的一个项目使用双token实现无感刷新。最后做了一些总结&#xff0c;本文详细介绍了实现流程&#xff0c;前后端详细代码。前端使用了Vue3Vite&#xff0c;主要是axios封装&#xff0c;服务…

Unity之OpenXR+XR Interaction Toolkit接入Pico VR一体机

一.前言 Pico VR 一体机是目前国内比较流行的VR设备之一&#xff0c;PICO成立于2015年3月&#xff0c;于2021年9月并入字节跳动。最新推出的Pico4一体机售价只有2400左右&#xff0c;这让很多家庭都入手了Pico设备&#xff0c;VR一体机的功能包括&#xff1a;VR全景视频&#…

学成在线笔记+踩坑(8)——课程预览、提交审核,Freemarker模板引擎

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题_java黑马笔记 目录 1 模块需求分析 1.1 模块介绍 1.2 业务流程 1.2.1 课程预览 1.2.2 课程审核 1.2.3 课程发布 2 课程预览 2.1 需求分析…

深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras

目录 一.引言 二.SENET Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Function 2.4 Test Main Function 2.5 完整代码 三.BiLinear Intercation Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Functi…

〖ChatGPT实践指南 - 零基础扫盲篇③〗- 开始使用 ChatGPT 并访问 OpenAI 获取 API Keys

文章目录 ⭐ 访问 ChatGPT 并登录⭐ OpenAI API keys 简介⭐ 获取 OpenAI 的 API keys 文件 请注意&#xff0c;该章节介绍的是如何使用 ChatGPT &#xff0c;并通过登录ChatGPT后访问 OpenAI 获取 API Keys&#xff0c;并不涉及如何科学的注册 ChatGPT。 ⭐ 访问 ChatGPT 并登…

D. Mysterious Present(Codeforces Beta Round 4 (Div. 2 Only))

https://codeforces.com/contest/4/problem/D 题目大意 给定 n n n 个信封的长和宽&#xff0c;以及一张卡片的长和宽&#xff0c;要求选出最多的信封&#xff0c;并且这些信封的长和宽都比前面的信封要大&#xff0c;并且最小的信封能够装下这张卡片。输出这些信封的数量和…

VS项目常规属性

常规属性页&#xff08;项目&#xff09; 常规 目标平台 指定运行项目的平台。例如&#xff0c;Windows&#xff0c;Android或iOS。 在此处&#xff0c;值 Windows 10 表示项目面向通用 Windows 平台。此属性是在创建项目时设置的只读字段。 目标平台版本 指定用于生成项目…

基于html+css的图展示41

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…