PHP基于原生GD库, 获取图片中文字颜色, 匹配稀有度

PHP基于原生GD库, 获取图片中文字颜色, 匹配稀有度

一,获取文字颜色部分

如果背景有渐变色就不是很准, 如果对颜色没有特殊要求,建议使用调整图片对比度

二, 匹配对应的稀有度数据

这块不是很重要根据自己情况调整

    /*** 根据文字颜色获取稀有度* @param Request $request* @return mixed|void|null*/public function getTextColor(Request $request){// 获得图片文件$file = $request->file('img');// 文件扩展$extension = $file->extension();// 文件尺寸信息(width, height)$imageSize = getimagesize($file);// 图片格式不同,需要调用不同的函数$image = null;if ($extension === 'png') {$image = imagecreatefrompng($file);}if ($extension === 'webp') {$image = imagecreatefromwebp($file);}if ($extension === 'jpg' || $extension === 'jpeg') {$image = imagecreatefromjpeg($file);}// 都没有匹配到返回提示信息if (is_null($image)) {exit(json_encode(['code' => 400, 'message' => '未知图片格式']));}// 调整对比度(重要)imagefilter($image, IMG_FILTER_CONTRAST, -50);// 文字颜色$result = $this->getTextColors($image, $imageSize[0], $imageSize[1]);// 稀有度return $this->getRarity($result);}/*** 获取文字颜色* @param $image* @param $imageWidth* @param $imageHeight* @return mixed*/public function getTextColors($image, $imageWidth, $imageHeight){// 假设图像中文字区域的左上角坐标为(100, 100),宽度为200,高度为50$textRegionX = 0;$textRegionY = 0;$textRegionWidth = $imageWidth;$textRegionHeight = $imageHeight;// 数组用于存储颜色及其数量$colors = array();// 循环遍历文字区域内的像素for ($x = $textRegionX; $x < $textRegionX + $textRegionWidth; $x++) {for ($y = $textRegionY; $y < $textRegionY + $textRegionHeight; $y++) {// 获取像素的颜色$color = @imagecolorat($image, $x, $y);// 将颜色转换为RGB值$rgb = imagecolorsforindex($image, $color);// 将颜色添加到数组中$colors[$color] = isset($colors[$color]) ? $colors[$color] + 1 : 1;}}// 根据颜色数量排序数组arsort($colors);// 获取前两种颜色$topColors = array_slice($colors, 0, 2, true);$colorArr = [];// 输出前两种颜色foreach ($topColors as $color => $count) {$rgb = imagecolorsforindex($image, $color);array_push($colorArr, "RGB({$rgb['red']},{$rgb['green']},{$rgb['blue']})");}return $colorArr[1];}/*** 获取稀有度* @param string $rgb* @return mixed|null*/public function getRarity(string $rgb){// 定义颜色的RGB范围$colors = [['color' => '灰色','rarity' => '粗糙','rgb' => 'RGB(146,146,146)',],['color' => '白色','rarity' => '普通','rgb' => 'RGB(255,255,255)',],['color' => '绿色','rarity' => '优秀','rgb' => 'RGB(160,255,0)',],['color' => '蓝色','rarity' => '稀有','rgb' => 'RGB(0,171,255)',],['color' => '紫色','rarity' => '史诗','rgb' => 'RGB(255,72,255)',],['color' => '橙色','rarity' => '传说','rgb' => 'RGB(255,196,0)',],['color' => '黄色','rarity' => '暗金','rgb' => 'RGB(255,255,187)',],];// 查找rgb相等的$result = collect($colors)->filter(function ($item) use ($rgb) {return $item['rgb'] === $rgb;})->values()->all();// 如果没有匹配到返回nullif (empty($result)) {return null;}return array_values($result)[0];}

有部分代码是使用 Laravel 框架的集合完成的
主要分为两部分

封装类


class GDTextColor
{/*** 获取图片文字区域*/public function getTextRegion($image, $ext, $x, $y){// 加载图片$image = self::load($image, $ext);// 裁剪图片return self::crop($image, $x, $y);}/*** 获取图片尺寸信息(width, height)*/public function getImageSize($file): array{$size = getimagesize($file);return ['width' => $size[0],'height' => $size[1],];}/*** 加载图片* @param $file* @return false|\GdImage|resource|void*/private static function load($file){$extension = $file->extension();// 图片格式不同,需要调用不同的函数$image = null;if ($extension === 'png') {$image = imagecreatefrompng($file);}if ($extension === 'webp') {$image = imagecreatefromwebp($file);}if ($extension === 'jpg' || $extension === 'jpeg') {$image = imagecreatefromjpeg($file);}// 都没有匹配到返回提示信息if (is_null($image)) {exit(json_encode(['code' => 400, 'message' => '未知图片格式']));}return $image;}/*** 裁剪图片文字区域* @param $image // 图片对象* @param int $x // 起始横坐标* @param int $y // 起始纵坐标* @param int $width // 宽* @param int $height // 高* @return false|\GdImage|resource*/private static function crop($image, int $x, int $y, int $width = 140, int $height = 30){// 创建裁剪后的图像资源$config = ['x' => $x,'y' => $y,'width' => $width,'height' => $height,];// 输出图片
//        $textRegionImage = imagecrop($image, $config);
//        header('Content-Type: image/jpeg');
//        imagejpeg($textRegionImage);
//        dd($textRegionImage);return imagecrop($image, $config);}/*** 获取文字颜色* @param $image* @param int $imageWidth* @param int $imageHeight* @return mixed*/public function getTextColors($image, int $imageWidth = 140, int $imageHeight = 30){// 调整对比度(重要)imagefilter($image, IMG_FILTER_CONTRAST, -50);// 假设图像中文字区域的左上角坐标为(100, 100),宽度为200,高度为50$textRegionX = 0;$textRegionY = 0;$textRegionWidth = $imageWidth;$textRegionHeight = $imageHeight;// 数组用于存储颜色及其数量$colors = array();// 循环遍历文字区域内的像素for ($x = $textRegionX; $x < $textRegionX + $textRegionWidth; $x++) {for ($y = $textRegionY; $y < $textRegionY + $textRegionHeight; $y++) {// 获取像素的颜色$color = @imagecolorat($image, $x, $y);// 将颜色转换为RGB值$rgb = imagecolorsforindex($image, $color);// 将颜色添加到数组中$colors[$color] = isset($colors[$color]) ? $colors[$color] + 1 : 1;}}// 根据颜色数量排序数组arsort($colors);// 获取前两种颜色$topColors = array_slice($colors, 0, 2, true);$colorArr = [];// 输出前两种颜色foreach ($topColors as $color => $count) {$rgb = imagecolorsforindex($image, $color);array_push($colorArr, "RGB({$rgb['red']},{$rgb['green']},{$rgb['blue']})");}return $colorArr[1];}/*** 调整RGB颜色的对比度* @param $color // rgb()* @param $contrast // 对比度 0 ~ 100* @return string*/public function adjustContrast($color, $contrast): string{// 将对比度限制在0到100之间$contrast = max(0, min(100, $contrast));// 将对比度转换为0到1之间的值$contrast = $contrast / 100;// 解析颜色值$color = str_replace('rgb(', '', $color);$color = str_replace(')', '', $color);$color = explode(',', $color);$r = intval($color[0]);$g = intval($color[1]);$b = intval($color[2]);// 将RGB值转换为0到1之间的范围$r /= 255;$g /= 255;$b /= 255;// 调整亮度和饱和度$brightness = (2 * $contrast) - 1;$saturation = $contrast;// 计算新的RGB值$r = $r + $brightness;$g = $g + $brightness;$b = $b + $brightness;if ($r > 1) {$r = 1;}if ($g > 1) {$g = 1;}if ($b > 1) {$b = 1;}// 调整饱和度$r = $r * $saturation;$g = $g * $saturation;$b = $b * $saturation;// 将RGB值转换回0到255的范围$r = round($r * 255);$g = round($g * 255);$b = round($b * 255);// 将RGB值合并为新的颜色$newColor = ($r << 16) | ($g << 8) | $b;return dechex($newColor);}/*** 获取稀有度*/public function getRarity($rgb){$colors = [['color' => '灰色','rarity' => '粗糙','min' => [90, 90, 90],'max' => [220, 220, 220]],['color' => '白色','rarity' => '普通','min' => [245, 245, 245],'max' => [255, 255, 255]],['color' => '绿色','rarity' => '优秀','min' => [0, 90, 0],'max' => [185, 255, 165]],['color' => '蓝色','rarity' => '稀有','min' => [0, 0, 128],'max' => [0, 255, 255]],['color' => '紫色','rarity' => '史诗','min' => [128, 0, 128],'max' => [255, 128, 255]],['color' => '橙色','rarity' => '传说','min' => [220, 128, 0],'max' => [255, 200, 128]],['color' => '黄色','rarity' => '暗金','min' => [220, 128, 128],'max' => [255, 255, 200]]];$rgbArr = $this->parseRGB($rgb);return $this->findMatchingColor($rgbArr, $colors);}/*** 判断颜色范围* @param $rgb* @param $colors* @return int|string|null*/public function findMatchingColor($rgb, $colors){foreach ($colors as $range) {$minR = $range['min'][0];$maxR = $range['max'][0];$minG = $range['min'][1];$maxG = $range['max'][1];$minB = $range['min'][2];$maxB = $range['max'][2];if ($rgb[0] >= $minR && $rgb[0] <= $maxR && $rgb[1] >= $minG && $rgb[1] <= $maxG && $rgb[2] >= $minB && $rgb[2] <= $maxB) {return $range;}}return null;}/*** 解析RGB并转换为数组* @param $rgbString* @return array*/public function parseRGB($rgbString): array{// 去除 RGB() 中的空格和括号$rgbString = str_ireplace(['RGB', '(', ')'], '', $rgbString);// 分割 RGB 值$rgbValues = explode(',', $rgbString);// 移除空格并转换为整数return array_map('intval', $rgbValues);}}

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

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

相关文章

Python计算巴氏距离

Python计算巴氏距离 巴氏距离简介 在统计中&#xff0c;巴氏距离&#xff08;Bhattacharyya Distance&#xff09;测量两个离散或连续概率分布的相似性。它与衡量两个统计样品或种群之间的重叠量的巴氏系数密切相关。巴氏距离和巴氏系数以20世纪30年代曾在印度统计研究所工作…

大麦订单截图生成 大麦一键生成订单截图

新版大麦订单生成 图样式展示 这个样式图就是在大麦生成完的一个订单截图&#xff0c;它的状态是等待卖家发货 后台一键生成&#xff0c;独立后台管理 教程&#xff1a;修改conf数据库账号密码 不会的可以看源码里有搭建教程 下载程序&#xff1a;https://pan.baidu.com/…

[论文笔记]MacBERT

引言 今天带来MacBERT的阅读笔记。论文题目是 重新审视中文自然语言处理的预训练模型。 本篇主要是探讨中文预训练语言模型在非英文语言中的有效性,然后提出了一种简单而有效的模型,称为MacBERT,它在多个方面改进了RoBERTa,特别是采用纠错型掩码语言模型(MLM as correcti…

Android widget 小部件使用指南强化版

Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图&#xff0c;这些数据和功能可以直…

提取多个txt数据并合成excel——例子:与中国建交的国家

提取多个txt数据并合成excel——例子&#xff1a;与中国建交的国家 一、概要二、整体架构流程三、完整代码 一、概要 这段代码主要执行以下任务&#xff1a; 1. 定义辅助函数&#xff1a;首先&#xff0c;定义了两个辅助函数。has_chinese_chars函数用于检查给定的字符串中是否…

如何在 Elasticsearch 中使用 Openai Embedding 进行语义搜索

随着强大的 GPT 模型的出现&#xff0c;文本的语义提取得到了改进。 在本文中&#xff0c;我们将使用嵌入向量在文档中进行搜索&#xff0c;而不是使用关键字进行老式搜索。 什么是嵌入 - embedding&#xff1f; 在深度学习术语中&#xff0c;嵌入是文本或图像等内容的数字表示…

vue2和vue3拖拽移动div

直接上代码&#xff0c;代码可以直接运行&#xff0c; vue2拖拽移动div&#xff1a; <template><divref"draggable"mousedown"dragStart"mousemove"drag"mouseup"dragEnd"style"width:100px;height:100px;background-c…

使用GDIView排查GDI对象泄漏导致的程序UI界面绘制异常问题

目录 1、问题说明 2、初步分析 3、查看任务管理器&#xff0c;并使用GDIView工具分析 4、GDIView可能对Win10兼容性不好&#xff0c;显示的GDI对象个数不太准确 5、采用历史版本比对法&#xff0c;确定初次出现问题的时间点&#xff0c;并查看前一天的代码修改记录 6、将…

【面试高高手】 —— Java集合篇(23题)

文章目录 1.Java中常见集合有哪些 &#xff1f;2. 说说你对Java集合是怎么理解的&#xff1f;3.请你说一下List&#xff0c;Set&#xff0c;Map三者的特点是 &#xff1f;4.在实际开发过程中如何更好的选择集合 &#xff1f;5. ArrayList和Vector区别 &#xff1f;6. ArrayList…

[HD2006.X1] 打印图形(菱形换壳)——海淀区赛

题目描述 由键盘输入 N N N &#xff0c;按一定的规律打印图形&#xff08;见输出样例&#xff09;。 输入格式 一个整数 N N N&#xff08;其中 3 ≤ N ≤ 21 3≤N≤21 3≤N≤21 &#xff09;&#xff0c; N N N 为奇数。 输出格式 如题中所描述的图形 样例 #1 样例…

Java之线程的详细解析二

2.线程同步 2.1卖票【应用】 案例需求 某电影院目前正在上映国产大片&#xff0c;共有100张票&#xff0c;而它有3个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票 实现步骤 定义一个类SellTicket实现Runnable接口&#xff0c;里面定义一个成员变量&#xff1a;privat…

MySQL架构 InnoDB存储引擎

1. 什么是Mysql&#xff1f; 我们在开发的时候&#xff0c;我们都需要对业务数据进行存储&#xff0c;这个时候&#xff0c;你们就会用到MySQL、Oracal等数据库。 MySQL它是一个关系型数据库&#xff0c;这种关系型数据库就有Oracal、 MySQL&#xff0c;以及最近很火的PgSQL等。…

9月24日回顾

1.微程序控制器的组成&#xff1a;指令译码器、微地址寄存器&#xff08;输出和暂存控制信息&#xff09;&#xff0c;时序电路、最核心的部件是控制存储器&#xff08;只读ROM组成&#xff09;—用来存储微指令 2.突发读写&#xff1a;比如说突发地址为8&#xff0c;那么只需…

Docker-Windows安装使用

1.下载docker https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 2.配置虚拟化环境 通过控制面板“设置”启用 Hyper-V 角色 右键单击 Windows 按钮并选择“应用和功能”。选择相关设置下右侧的“程序和功能”。选择“打开或关闭 Windows 功能”。选择“Hyper-…

ubuntu安装freeswitch 1.10.10

1、安装ffmpeg4.2 1.1、安装依赖库 sudo apt install yasm libogg-dev pkg-config libopus-dev libvpx-dev libx264-dev libx265-dev libfdk-aac-dev libsdl2-dev libfdk-aac-dev libmp3lame-dev libopencore-amrwb-dev libopencore-amrnb-dev libvorbis-dev libxvidcore-dev…

ElementUI -- Mock.js介绍和使用与首页导航栏左侧菜单搭建

1.1 mockjs介绍 Mock.js是一个用于生成随机数据和模拟接口请求的JavaScript库。它可以帮助开发人员在前端开发过程中模拟后端接口的返回数据&#xff0c;以便进行前端页面的开发和测试。 Mock.js有两个重要的特性风靡前端: 数据类型丰富 Mock.js提供了一套简单易用的API&#x…

查找排序部分习题 242. 有效的字母异位词 74. 搜索二维矩阵 1. 两数之和 167.两数之和 II

242. 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 class Solution(object):def isAnagram(self, s, t):""…

cocos creator项目构建问题

1.Build Failed: Compile error : Maximum call stack size exceeded 遇到这种问题首先要确认&#xff0c;一定要确认 自己的代码是否存在问题。 因为我出现这个问题就是由于代码中出现问题。 某个js文件是用于当做配置或者文本配置的时候就需要注意了&#xff0c;不能在旧变…

双指针算法——移动零

双指针算法——移动零&#x1f60e; 前言&#x1f64c;题目详情&#xff1a;图解分析&#xff1a;代码分享&#xff1a;B站讲解视频链接&#xff1a; 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧…

红队打靶:THE PLANETS: MERCURY打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;Web渗透 第三步&#xff1a;获取初步立足点并搜集信息 第四步&#xff1a;软连接劫持sudo提权 总结与思考 写在开头 本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶&#xff0c;详述了…