图片边缘采样

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入 本例程使用STM32G070xx芯片,Flash大小128KB,Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次,每个存储区的块都有各自的头部标记 阅读详情

普通采样

 const getEdgeColors = (img) => {
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');
    canvas.width = img.width;
    canvas.height = img.height;
    try {
      context.drawImage(img, 0, 0);

    // 获取左边缘颜色
      const leftPixel = context.getImageData(0, Math.floor(img.height / 2), 1, 1).data;
      const leftColor = `rgb(${leftPixel[0]}, ${leftPixel[1]}, ${leftPixel[2]})`;

    // 获取右边缘颜色
      const rightPixel = context.getImageData(img.width - 1, Math.floor(img.height / 2), 1, 1).data;
      const rightColor = `rgb(${rightPixel[0]}, ${rightPixel[1]}, ${rightPixel[2]})`;
      console.log('获取图片边缘颜色成功:', leftColor, rightColor);
      return { leftColor, rightColor };
    } catch (error) {
      console.error('获取图片边缘颜色失败:', error);
      return { leftColor: '#ffffff', rightColor: '#ffffff' };
    }
  };

优化:

1)采样多个点而不是只取中间一点,提高颜色准确性;
2)实现边缘区域的平均采样,避免单点采样可能带来的颜色偏差;
3)添加颜色增强处理,使背景色更加美观;
4)优化错误处理机制,确保在各种情况下都能返回合适的颜色值;
5)添加颜色平滑过渡效果,使轮播切换时背景色变化更加自然。

  // 获取图片边缘颜色 - 优化版本
  const getEdgeColors = (img) => {
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');
    canvas.width = img.width;
    canvas.height = img.height;
    
    try {
      context.drawImage(img, 0, 0);
      
      // 采样点数量和区域大小
      const samplePoints = 5; // 垂直方向采样点数量
      const sampleWidth = 10;  // 水平方向采样宽度
      const sampleHeight = Math.floor(img.height / samplePoints); // 每个采样点的高度间隔
      
      // 左边缘颜色采样
      let leftR = 0, leftG = 0, leftB = 0;
      for (let i = 0; i < samplePoints; i++) {
        // 计算当前采样点的垂直位置
        const y = Math.floor(sampleHeight * (i + 0.5));
        
        // 获取左边缘区域的平均颜色
        const leftData = context.getImageData(0, y, sampleWidth, 1).data;
        for (let j = 0; j < sampleWidth * 4; j += 4) {
          leftR += leftData[j];
          leftG += leftData[j + 1];
          leftB += leftData[j + 2];
        }
      }
      
      // 计算左边缘平均颜色
      leftR = Math.floor(leftR / (samplePoints * sampleWidth));
      leftG = Math.floor(leftG / (samplePoints * sampleWidth));
      leftB = Math.floor(leftB / (samplePoints * sampleWidth));
      
      // 右边缘颜色采样
      let rightR = 0, rightG = 0, rightB = 0;
      for (let i = 0; i < samplePoints; i++) {
        // 计算当前采样点的垂直位置
        const y = Math.floor(sampleHeight * (i + 0.5));
        
        // 获取右边缘区域的平均颜色
        const rightData = context.getImageData(img.width - sampleWidth, y, sampleWidth, 1).data;
        for (let j = 0; j < sampleWidth * 4; j += 4) {
          rightR += rightData[j];
          rightG += rightData[j + 1];
          rightB += rightData[j + 2];
        }
      }
      
      // 计算右边缘平均颜色
      rightR = Math.floor(rightR / (samplePoints * sampleWidth));
      rightG = Math.floor(rightG / (samplePoints * sampleWidth));
      rightB = Math.floor(rightB / (samplePoints * sampleWidth));
      
      // 颜色增强处理 - 适当提高饱和度
      const enhanceColor = (r, g, b) => {
        // 计算亮度
        const brightness = (r + g + b) / 3;
        
        // 如果颜色太暗或太亮,适当调整
        if (brightness < 30) {
          // 提亮暗色
          return {
            r: Math.min(255, r + 30),
            g: Math.min(255, g + 30),
            b: Math.min(255, b + 30)
          };
        } else if (brightness > 220) {
          // 降低过亮的颜色
          return {
            r: Math.max(0, r - 20),
            g: Math.max(0, g - 20),
            b: Math.max(0, b - 20)
          };
        } else {
          // 适当提高饱和度
          const max = Math.max(r, g, b);
          const min = Math.min(r, g, b);
          const delta = max - min;
          
          if (delta > 10) { // 有一定色差才增强饱和度
            const saturationFactor = 1.2;
            const newR = r + (r - brightness) * saturationFactor;
            const newG = g + (g - brightness) * saturationFactor;
            const newB = b + (b - brightness) * saturationFactor;
            
            return {
              r: Math.min(255, Math.max(0, Math.round(newR))),
              g: Math.min(255, Math.max(0, Math.round(newG))),
              b: Math.min(255, Math.max(0, Math.round(newB)))
            };
          }
          
          return { r, g, b };
        }
      };
      
      // 应用颜色增强
      const enhancedLeft = enhanceColor(leftR, leftG, leftB);
      const enhancedRight = enhanceColor(rightR, rightG, rightB);
      
      // 生成最终颜色
      const leftColor = `rgb(${enhancedLeft.r}, ${enhancedLeft.g}, ${enhancedLeft.b})`;
      const rightColor = `rgb(${enhancedRight.r}, ${enhancedRight.g}, ${enhancedRight.b})`;
      
      console.log('获取图片边缘颜色成功:', leftColor, rightColor);
      return { leftColor, rightColor };
    } catch (error) {
      console.error('获取图片边缘颜色失败:', error);
      // 返回一个柔和的默认颜色,而不是纯白色
      return { leftColor: '#f5f5f5', rightColor: '#f5f5f5' };
    }
  };

采用切片的方案进行循环填充

// 创建边缘切片的canvas
export const createEdgeSlice = (img: HTMLImageElement, isLeft: boolean): string => {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  const sliceWidth = 1; // 切片宽度

  canvas.width = sliceWidth;
  canvas.height = img.height;

  if (isLeft) {
    if (ctx) {
      ctx.drawImage(img, 0, 0, sliceWidth, img.height, 0, 0, sliceWidth, img.height);
    } else {
      // 如果ctx为null则抛出错误
      throw new Error('无法获取canvas上下文');
    }
  } else {
    if (ctx) {
      ctx.drawImage(img, img.width - sliceWidth, 0, sliceWidth, img.height, 0, 0, sliceWidth, img.height);
    } else {
      // 如果ctx为null则抛出错误
      throw new Error('无法获取canvas上下文');
    }
  }
  console.log('获取到了边缘切片 base64')
  return canvas.toDataURL();
};

采样某个点进行渐变

export const getEdgeColors = (img) => {
  const canvas = document.createElement('canvas');
  const context = canvas.getContext('2d');
  canvas.width = img.width;
  canvas.height = img.height;
  try {
    // 检查 context 是否为 null
    if (!context) {
      throw new Error('无法获取 canvas context');
    }
    context.drawImage(img, 0, 0);

    // 获取顶部中间位置的左右边缘颜色
    const middleX = Math.floor(img.width / 2);
    // 使用中间点位即可
    const middlePixel = context.getImageData(middleX, 0, 1, 1).data;
    // const leftPixel = context.getImageData(0, 0, 1, 1).data;
    // const rightPixel = context.getImageData(img.width - 1, 0, 1, 1).data;
    const leftPixel = middlePixel;
    const rightPixel = middlePixel;
    // 创建渐变色字符串
    const createGradient = (color, direction) => {
      const [r, g, b] = color;
      // direction: 渐变方向,可以是'right'或'left'
      // r,g,b: RGB颜色值
      // 渐变包含6个颜色节点:
      // 1. 0%位置: 完全不透明的原始颜色
      // 2. 20%位置: 85%透明度
      // 3. 40%位置: 60%透明度
      // 4. 60%位置: 35%透明度
      // 5. 80%位置: 15%透明度
      // 6. 100%位置: 完全透明
      return `linear-gradient(to ${direction}, rgb(${r}, ${g}, ${b}) 0%, rgba(${r}, ${g}, ${b}, 0.85) 20%, rgba(${r}, ${g}, ${b}, 0.6) 40%, rgba(${r}, ${g}, ${b}, 0.35) 60%, rgba(${r}, ${g}, ${b}, 0.15) 80%, rgba(${r}, ${g}, ${b}, 0) 100%)`;
    };

    const leftColor = createGradient([leftPixel[0], leftPixel[1], leftPixel[2]], 'right');
    const rightColor = createGradient([rightPixel[0], rightPixel[1], rightPixel[2]], 'left');

    console.log('获取图片边缘渐变颜色成功:', leftColor, rightColor);
    return { leftColor, rightColor };
  } catch (error) {
    console.error('获取图片边缘颜色失败:', error);
    // 返回柔和的默认渐变颜色
    const defaultColor = [245, 245, 245]; // #f5f5f5
    return {
      leftColor: `linear-gradient(to right, rgb(${defaultColor.join(',')}) 0%, rgba(${defaultColor.join(',')}, 0) 100%)`,
      rightColor: `linear-gradient(to left, rgb(${defaultColor.join(',')}) 0%, rgba(${defaultColor.join(',')}, 0) 100%)`
    };
  }
};

hive sql每个用户的累积访问次数 我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/23 6 U01 2017/2/22 4 要求使用SQL... 阅读详情

相关推荐

基于stm32的数控恒压恒流电源设计方案

基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特

m0_72265581的博客 7218

主动学习(Active Learning)

主动学习1、定义2、步骤3、分类3.1 Membership Query Synthesis3.2 Stream-Based Selective Sampling3.3 Pool-Based Sampling4、Query Strategy Frameworks4.1 Uncertainty Sampling4.1.1 least confident4.1.2 Margin Sampling4.1.3 Entropy4.2 Query-By-Committee4.2.1 Vote Entropy(投票熵)

baidu_41797613的博客 3057

springboot + netty 实现多客户端登录 超出设备 并下线

本文档旨在详细描述多平台登录控制的需求和实现方案。当前系统仅支持单设备登录,需扩展为支持多设备同时在线,并提供多种登录策略。文档详细列出四种策略:单平台登录、双平台登录、三平台登录和多平台同时在线,每种策略的具体限制和支持平台。技术实现方案包括数据结构设计、NettyUtils 工具类方法、WebSocketHandler 修改,以及相应的测试方案

Likefr 1877

主动学习(active learning)

主动学习

qq_46458188的博客 2455

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6488

对图像边缘进行随机均匀采样的C#算法实现

图像边缘含有图像形状的丰富信息,然而,图像边缘有时所含的像素点还是太多,很多情况下需要继续精简(比如,使用 ShapeContext 进行形状匹配),于是就出现一个问题:如何从图像边缘上提取出N个点,使这N个点最具有代表性呢?一个很直观的思路是: (1)这N个点要在图像边缘上; (2)最近邻的两点之间要尽量分散开。 如,图像为: 需要设计一个采样算法,使它得到下面的...

aobannie0463的博客 434

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

【Xilinx Vivado时序分析/约束系列8】FPGA开发时序分析/约束-FPGA数据中间采样、边缘采样PLL时序优化实操

目录 时序分析实操 分析数据手册 实验工程 输入部分 输出部分 顶层部分 设计层次 综合布线 时序约束 时钟约束 输入延时约束 分析输入延时的约束如何设计 数据中间采样 最小延时约束 最大延时约束 结果分析 数据边缘采样 添加input delay约束 时序报告 解决方法 PLL IP配置参数 综合布线 改变PLL IP中的相移参数 综合布线 结果分析 往期系列博客 时序分析实操 本实验根据数据手册分析,对时序进行约束,分为两种情况:数据中间采样.

记录学习历程 7117

Vue Vben Admin 登录页修改全攻略:从登录界面定制到接口对接全流程配置

方式一:修改国际化文件找到对应的语言包文件,修改和的值。方式二:直接传递文本page-description="现代化的后台管理系统模板"page-title="欢迎使用 Vue Vben Admin"从上面的代码可以看出,登录表单使用了的方式来定义表单字段,这种方式提供了极大的灵活性。如果你想要自定义表单,可以修改formSchema数组。如果你的登录需求非常特殊,现有的组件无法满足,你可以完全自定义表单。只需在login.vue中替换<template><h2>自定义登录</h2>

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 479

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

图像的上采样(upsampling)与下采样(subsampled)

转自:http://baike.baidu.com/view/3038019.htm和http://blog.sina.com.cn/s/blog_672c5a470100pmj6.html 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。放大图像(或称为上采样(upsampling)或

恰同学少年的博客 24万+

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 689

图片生成 Low Poly 风格图片的 app

图片生成 Low Poly 风格图片的 app

未来很长,但我会努力的走下去。 2859

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

告别图片背景违和!autohue.js 让图片与背景自动 “无缝衔接”

摘要: autohue.js 是一款智能提取图片主题色与边缘色的 npm 工具,专为解决网页中图片与背景色不融合的痛点设计。它能自动提取主色、次色及四边边缘色,支持生成自然渐变背景,适用于轮播 Banner、商品展示等场景。相比传统取色库(如 color-thief),autohue.js 针对性优化了边缘色分析和性能平衡,通过降采样提升效率。安装简单,支持自定义阈值与尺寸参数,一键实现“无缝衔接”效果。 亮点: 场景化设计,精准适配 UI 需求 边缘色提取 + 渐变生成,告别手动调色 轻量高效,开源免费

分享Java,vue学学习笔记 801

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android_Bitmap_图片的二次采样并生成缩略图

首先尝试通过字节数组或者流,只去加载图片的外边缘,此时必须指定BitmapFactory.Options 的inJustDecodeBounds成员名,将其只为true,一旦设置为true,BitmapFactory解码后返回值为null,通过Options的outHeight和outWidth可以获得图片的宽高。然后根据大小制定合适的缩放比例,通过options.inSampleSize,大大降

幻年,时光。 4568

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

学习OpenCV4 练习一(滤波、下采样、边缘检测、像素操作、坐标转换)

C++ 学习OpenCV4 基础练习一(滤波、下采样、边缘检测、像素操作、坐标转换)

RayChiu757374816的博客 397

openCV cvPyrDown cvPyrUp Canny 图像缩放,边缘检测

#include &quot;opencv2/core.hpp&quot; #include &quot;opencv2/highgui.hpp&quot; #include &quot;opencv2/imgproc.hpp&quot; #include &quot;opencv2/videoio.hpp&quot; #include &quot;opencv2/imgcodecs.hpp&quot; using n

若有博文对您有帮助,欢迎点赞关注,收藏评论。 678

OpenCV入门(19):图片的油画特效

import cv2 import numpy as np img = cv2.imread("./mm1.jpg",1) cv2.imshow("src",img) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] # 油画特效:1.gray 2.分图片为若干个小方块:例:8*8 3.将0-255划分为几个等级,并映射到...

weixin_44650248的博客 1060

ios图片放大之后如何不模糊_三个小妙招,让图片真正“无码”

​封面图:网图+PS编辑:亠口冋辶大大家经常在网上搜索下载图片,但是下载后的图片往往很不清晰,还有时候自己的作品存了小图,扩大成大图之后“无力回天”,结果想找源文件也丢失了,那么这种情况下能让它放大后变清楚一点吗?接下来给大家介绍三种方法,对应三种不同的情况,可以让小图变大图,低像素变高像素,边缘还不会模糊,图像也没有杂色,用PS的旧功能统统实现!//目录导航//让模糊图片变清晰 1.图像大...

weixin_29212429的博客 1906

opencv实现图像缩放及canny边缘处理

// ZoomCanny.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "highgui.h" #include "cv.h" IplImage* doPyrDown(IplImage* in, int filter = IPL_GAUS

qiongguishanglu的专栏 1426

机器学习进阶-图像金字塔与轮廓检测-图像金字塔(拉普拉斯金字塔)

拉普拉斯金字塔: 使用原始图片 - pyrUp(pyrDown(Gi)), 获得的结果有一点像边缘轮廓的提取 上图的意思:1.进行低通滤波 2.进行样本的下采样 3. 进行样本的上采样 4.原始图片 - 经过上面三步后的图片 代码: 第一步:读入图片 第二...

weixin_33908217的博客 449

揭秘Dify DOCX图片压缩黑科技:如何实现秒级优化与清晰度保留

揭秘Dify DOCX图片处理黑科技,实现秒级压缩与清晰度保留。适用于文档优化、办公协作等场景,采用智能算法平衡文件大小与画质,提升传输效率。方法简单高效,一键完成批量处理,值得收藏。

AlgoInk的博客 1053

Java图片水印实战:从基础实现到动态透明度调节

本文详细介绍了Java图片水印的实战应用,从基础的文字和图片水印实现入手,重点解析了如何通过动态透明度调节技术解决水印与背景冲突的痛点。文章提供了完整的代码示例,包括亮度感知、区域采样等智能自适应策略,并分享了性能优化与生产环境避坑指南,帮助开发者打造专业级的水印解决方案。

f9g0h的博客 396

UnityShader纹理特效(一) 图片添加阴影

两天前有个朋友想要弄个给图片加阴影的效果找我帮忙,刚开始比较纳闷图片加阴影,怎么个加法,当他发了张图瞬间就懂了,效果是这样的: 原理就是简单的一个UV小幅度的偏移采样得到影子然后和原始UV采样的结果叠加在一起(影子在后面原图在前面)就OK了.(纹理的wrapMode需要设置为Clamp) 完整的Shader: Shader "Custom/ImageShadow" { Prope...

Vitens的专栏 3236

autohue.js:让你的图片和背景融为一体,绝了!

需求 先来看这样一个场景,拿一个网站举例 这里有一个常见的网站 banner 图容器,大小为为 1910*560 ,看起来背景图完美的充满了宽度,但是图片原始大小时,却是: 它的宽度只有 1440 ,且 background-size 设置的是 contain ,即等比例缩放,那么可以断定它两边的蓝

fenfenfen520a的博客 157
上一篇: 提示器模板
下一篇: Vue项目中进行接口异常错误上报
composurext
博客等级 码龄10年 15粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值