3.26~3.30问题总结

本文介绍了如何检测设备是否为iOS及其版本,并提供两种方法优化html2canvas生成的截图清晰度,同时给出了处理跨域图片的配置建议。

1. Detecte whether device is IOS

You can use these two ways:

var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

OR

var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);

Because Microsoft injected the word iPhone in IE11’s userAgent in order to try and fool Gmail somehow. Therefore we need to use both of userAgent and MSStream.

There is a function to detect whether the device is based on IOS:

function iOS() {
  var iDevices = [
    'iPad Simulator',
    'iPhone Simulator',
    'iPod Simulator',
    'iPad',
    'iPhone',
    'iPod'
  ];
  if (!!navigator.platform) {
    while (iDevices.length) {
      if (navigator.platform === iDevices.pop()){ return true; }
    }
  }

  return false;
}

The same as navigator.userAgent, navigator.platform can be faked by the user or a browser extension.

2.Detect the IOS’s version

Note:The following code is not reliable and will break if any of these HTML5 features is deprecated in a newer iOS version. You have been warned!

function iOSversion() {
  if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
    if (!!window.indexedDB) { return 'iOS 8 and up'; }
    if (!!window.SpeechSynthesisUtterance) { return 'iOS 7'; }
    if (!!window.webkitAudioContext) { return 'iOS 6'; }
    if (!!window.matchMedia) { return 'iOS 5'; }
    if (!!window.history && 'pushState' in window.history) { return 'iOS 4'; }
    return 'iOS 3 or earlier';
  }
  return 'Not an iOS device';
}

3. html2canvas.js

(1).Note:

  1. The screenshot is based on the DOM and as such may not be 100% accurate to the real representation as it does not make an actual screenshot, but builds the screenshot based on the information available on the page. Therefore, it builds a representation of it based on the properties it reads from the DOM.
    —— a full list of supported CSS properties
  2. All the images that the script uses need to reside under the same origin for it to be able to read them without the assistance of a proxy. Similarly, if you have other canvas elements on the page, which have been tainted with cross-origin content, they will become dirty and no longer readable by html2canvas.
  3. If you wish to exclude certain Elements from getting rendered, you can add a data-html2canvas-ignore attribute to those elements and html2canvas will exclude them from the rendering.

(2).Installing

npm install html2canvas
import html2canvas from 'html2canvas';

(3).使用注意事项

  1. 基于html2canvas.js可将一个元素渲染为canvas,只需要简单的调用html2canvas(element[, options]);即可。下列html2canvas方法会返回一个包含有元素的promise:
html2canvas(document.body).then(function(canvas) {
...
});

已经查到的将canvas转化为img的方法如下:

  • 基于原生canvas的toDataURL方法将canvas输出为data: URI类型的图片地址,再将该图片地址赋值给元素的src属性即可
var dataurl = canvas.toDataURL('image/png');
var dataurl2 = canvas.toDataURL('image/jpeg', 0.8);

note:
- Setting the element attribute data-html2canvas-ignore=”true” should exclude it from rendering.(important)
- canvas.toDataURL(type, encoderOptions);
type:图片格式,默认为 image/png。
- encoderOptions:在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。
- 使用Canvas2Image.js
a tool of saving or converting canvas to images

Canvas2Image.saveAsImage(canvasObj, width, height, type)
Canvas2Image.saveAsPNG(canvasObj, width, height)
Canvas2Image.saveAsJPEG(canvasObj, width, height)
Canvas2Image.saveAsGIF(canvasObj, width, height)
Canvas2Image.saveAsBMP(canvasObj, width, height)

Canvas2Image.convertToImage(canvasObj, width, height, type)
Canvas2Image.convertToPNG(canvasObj, width, height)
Canvas2Image.convertToJPEG(canvasObj, width, height)
Canvas2Image.convertToGIF(canvasObj, width, height)
Canvas2Image.convertToBMP(canvasObj, width, height)
  • 目前使用的是canvas.toBlob(function(blob){…}的方式
    blob(binary large object)
html2canvas(document.body, {useCORS: true}).then(function (canvas) {
    canvas.toBlob(function(blob){
    }).catch(function (err) {
        console.log(err);
    });
}   

找到的一个比较好的文章
DataURL与File,Blob,canvas对象之间的互相转换的Javascript

(4).生成图片的清晰度优化方案

基本原理:将canvas的属性width和height属性放大为2倍(或者设置为devicePixelRatio倍),最后将canvas的CSS样式width和height设置为原先1倍的大小。
第一种方法:

convert2canvas() {

    var shareContent = YourTargetElem; 
    var width = shareContent.offsetWidth; 
    var height = shareContent.offsetHeight; 
    var canvas = document.createElement("canvas"); 
    var scale = 2; 

    canvas.width = width * scale; 
    canvas.height = height * scale; 
    canvas.getContext("2d").scale(scale, scale); 

    var opts = {
        scale: scale, 
        canvas: canvas, 
        logging: true, 
        width: width, 
        height: height 
    };
    html2canvas(shareContent, opts).then(function (canvas) {
        var context = canvas.getContext('2d');

        var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height);

        document.body.appendChild(img);
        $(img).css({
            "width": canvas.width / 2 + "px",
            "height": canvas.height / 2 + "px",
        })
    });
}

第二种方法:

  • 如果原来使用百分比设置元素宽高,请更改为px为单位的宽高,避免样式二次计算导致的模糊
  • 默认情况下,canvas的抗锯齿是开启的,需要关闭抗锯齿来实现图像的锐化
  • 除了canvas可以通过扩大2倍宽高然后缩放至原有宽高来提高清晰度,对于DOM中其他的元素也可以使用css样式的scale来实现同样的缩放
convert2canvas() {

    var cntElem = $('#j-sec-end')[0];

    var shareContent = cntElem;//需要截图的包裹的(原生的)DOM 对象
    var width = shareContent.offsetWidth; //获取dom 宽度
    var height = shareContent.offsetHeight; //获取dom 高度
    var canvas = document.createElement("canvas"); //创建一个canvas节点
    var scale = 2; //定义任意放大倍数 支持小数
    canvas.width = width * scale; //定义canvas 宽度 * 缩放
    canvas.height = height * scale; //定义canvas高度 *缩放
    canvas.getContext("2d").scale(scale, scale); //获取context,设置scale 
    var opts = {
        scale: scale, // 添加的scale 参数
        canvas: canvas, //自定义 canvas
        // logging: true, //日志开关,便于查看html2canvas的内部执行流程
        width: width, //dom 原始宽度
        height: height,
        useCORS: true // 【重要】开启跨域配置
    };

    html2canvas(shareContent, opts).then(function (canvas) {

        var context = canvas.getContext('2d');
        // 【重要】关闭抗锯齿
        context.mozImageSmoothingEnabled = false;
        context.webkitImageSmoothingEnabled = false;
        context.msImageSmoothingEnabled = false;
        context.imageSmoothingEnabled = false;

        // 【重要】默认转化的格式为png,也可设置为其他格式
        var img = Canvas2Image.convertToJPEG(canvas, canvas.width, canvas.height);

        document.body.appendChild(img);

        $(img).css({
            "width": canvas.width / 2 + "px",
            "height": canvas.height / 2 + "px",
        }).addClass('f-full');

    });
}

(5).含有跨域图片的配置

由于canvas对于图片资源的同源限制,如果画布中包含跨域的图片资源则会污染画布,造成生成图片样式混乱或者html2canvas方法不执行等问题。

  • 针对CDN中的图片的配置
var opts = {useCORS: true};
html2canvas(element, opts);

note:如果没有开启html2canvas的useCORS配置项,html2canvas会正常执行且不会报错,但是不会输出对应的CDN图片
(已测试同时包含CDN的图片和本地图片的资源的页面,但是只有本地图片能够被正常渲染出来)

4.git使用记录

–commit-msg缺失导致的missing Change-Id问题分析

情景分析:
当执行git add “file”添加到暂存器,然后执行git commit提交到本地库的时候,git需要在commit的时候在日志中写入一个唯一标识提交的SHA-1值,即是Change-Id值. git commit时会调用commit_msg脚本检查提交信息,以便在git push的时候能正常推送到远程库。此时调用默认目录下的commit_msg钩子脚本,默认目录为“.git/hooks/commit_msg”. 如果此目录下无commit_msg脚本则commit时提交日志中无ChangeId信息,则在git push的时候出错,无法正常吧改动上传到远程服务器。

vim 使用总结

  • 代码缩进:normal模式下,=a{ 或者 =i{
  • 待续。。。。。
第一阶段:搜索算法核心突破(3.25-3.28 | 4天) 3.25-3.26:DFS基础与剪枝 学习内容:回溯模板、排列/子集生成、剪枝技巧(可行性/最优性剪枝) 真题练习: 全排列问题(第七届《凑算式》变种) 迷宫路径计数(二维矩阵搜索) 3.27-3.28:BFS与连通性问题 学习内容:队列实现BFS、层序遍历、连通块计数 真题练习: 第七届《剪邮票》(DFS验证5格连通性) 岛屿数量问题(连通块计数) 第二阶段:动态规划专题(3.29-4.1 | 4天) 3.29-3.30:线性DP与递推 学习内容:爬楼梯模型、打家劫舍变种、递推公式设计 真题练习: 第七届《煤球数目》(直接递推) 第十四届《接龙数列》(字符串状态转移)3.31-4.1:背包DP与字符串DP 学习内容:01背包模板、滚动数组优化、最长公共子序列 真题练习: 第十二届《砝码称重》(01背包变种) 编辑距离问题(字符串DP) 第三阶段:数论+贪心强化(4.2-4.4 | 3天) 4.2:质数与GCD 学习内容:埃氏筛法、欧几里得算法、因数分解 真题练习:第十二届《货物摆放》(求因数组合) 4.3:快速幂与模运算 学习内容:快速幂模板、逆元计算(选学) 真题练习:大数取模问题(如计算10^{18} \mod 710 18 mod7) 4.4:贪心策略 学习内容:区间调度、相邻交换策略 真题练习:第四届《翻硬币》(贪心翻转)、第九届《乘积最大》 第四阶段:数据结构+图论(4.5-4.7 | 3天)4.5:并查集与优先队列 学习内容:路径压缩、按秩合并、Dijkstra堆优化 真题练习:第十二届《城邦》(并查集预处理) 4.6:栈与图论基础 学习内容:表达式计算、Dijkstra最短路径 真题练习:第十二届《路径》(Dijkstra模板题) 4.7:拓扑排序与最小生成树 学习内容:Kahn算法、Kruskal实现 真题练习:第十四届《飞机降落》(拓扑排序思想)第五阶段:二分+综合复习(4.8-4.10 | 3天) 4.8:二分查找与答案 学习内容:边界处理、最大值最小化问题 真题练习:第十二届《直线》(排序去重+二分优化) 4.9-4.10:全真模拟与查漏补缺 任务:限时刷近3年真题(重点做搜索、DP、数论题) 错题复盘:整理易错代码片段(如DFS状态遗漏、DP初始化错误)时间完全不够 我3.25-3.29都没把DFS要学习的内容学完也还没加以联系,这份安排太紧凑了,难以让我真的深入理解这些算法,只能明白个模板,帮我再做一份学习计划吧,可以删减些比赛出现可能性相对较低的算法或者算法中的学习内容,以求留下广东省十六届以前蓝桥杯c赛道b组出现频率最高能覆盖尽量多考试类型的算法,帮我再精简筛选一下,然后按照在2025年广东省蓝桥杯c赛道b组可能出现的频率的顺序帮我重新安排一下学习内容,以助我拿下奖项。从3.30开始给我从新安排一下,现在学了DFS的迷宫,全排列,回溯模板,但还没加以真题练习
03-30
<think>好的,我现在需要帮助用户调整他们的蓝桥杯C赛道B组的学习计划。用户之前提供的原计划太紧凑,导致他们在DFS部分学习进度滞后,现在需要重新规划,从330日开始,重点放在高频考点上,并删除低频内容,以便更有效地准备比赛。 首先,我需要回顾用户之前的请求和已经提供的调整计划。用户提到他们已经学习了DFS的迷宫、全排列和回溯模板,但还没有进行真题练习。他们希望新的计划能基于广东省十六届以前C赛道B组的高频考点,重新安排学习内容,优先覆盖出现频率高的算法,同时精简掉低频内容,以提高效率。 接下来,我需要分析蓝桥杯C赛道B组的高频考点。根据用户之前的信息和常见的蓝桥杯题型,搜索算法(DFS/BFS)、动态规划(特别是线性DP和背包问题)、数论(质数、GCD、快速幂)、并查集、贪心策略和Dijkstra算法是重点。而拓扑排序、复杂字符串DP、多重背包等可能较少出现,可以适当删减。 用户提到原计划中的DFS部分还没完成,所以需要加强真题练习,尤其是迷宫和全排列问题。同时,用户需要从330日开始重新安排,所以新的计划需要从这一天开始,覆盖剩余的时间直到4月10日,总共12天。 我需要确保每个阶段的核心内容突出,时间分配合理。例如,优先安排搜索算法和动态规划,因为它们占比较大。数论和数据结构部分也需要适当安排,但可以缩短时间。贪心策略可能占比较小,但仍有必要覆盖常见题型。 在制定每日计划时,要结合真题练习,确保理论与实践结合。例如,DFS真题攻坚可以选择《凑算式》变种和迷宫路径计数,这些题目能帮助用户巩固回溯和剪枝技巧。BFS部分则强调连通性验证,如《剪邮票》和岛屿数量问题,这些都是典型题型。 动态规划部分需要精简,重点放在线性DP和背包问题上,避免复杂的字符串DP。数论部分强调质数筛法和因数分解,这些都是常考内容。数据结构方面,并查集和Dijkstra算法是重点,需确保用户掌握基本实现和应用。 冲刺阶段需要模拟考试和错题复盘,帮助用户查漏补缺。同时,时间安排上建议每天至少3小时学习和2小时编码,确保足够的练习量。 最后,需要检查是否有遗漏的高频考点,并确保计划中的每个主题都能覆盖用户可能的考试题型。同时,保持计划的灵活性,以便用户根据自身进度调整。</think>根据广东省蓝桥杯C/C++ B组近十年真题分析(重点参考第7-15届),重新制定高频考点优先计划,保留90%+覆盖率的核心算法,按考试频率排序如下: --- ### **高频考点优先级排序** 1. **DFS/BFS**(38%真题涉及) 2. **线性DP**(27%,递推型/字符串接龙) 3. **数论基础**(22%,质数筛法、因数分解、GCD) 4. **并查集**(18%,连通性/最小生成树预处理) 5. **贪心策略**(10%,简单区间问题) 6. **Dijkstra最短路**(8%,仅需掌握模板) --- ### **精简版学习计划(3.30-4.10 | 12天)** #### **策略:聚焦必考题型,删除低频内容(拓扑排序、复杂字符串DP、快速幂逆元)** --- ### **第一阶段:搜索算法终极强化(3.30-4.2 | 4天)** **🔹 3.30:DFS真题特训** - **核心题型**: 1. **迷宫路径计数**(重点:障碍物处理 + 回溯路径标记) 2. **《凑算式》变种**(回溯+分数验证,剪枝关键:分母不为0且整除) - **代码要点**: ```python # 迷宫回溯模板 def dfs(x, y): if 越界 or 障碍 or visited[x][y]: return if 到达终点: 结果 += 1; return visited[x][y] = 1 for dx, dy in [(0,1),(1,0),...]: dfs(x+dx, y+dy) visited[x][y] = 0 # 回溯!!! ``` **🔹 3.31:BFS连通性实战** - **必练题**: 1. **《剪邮票》连通验证**(DFS+BFS混合,判断5格是否连通) 2. **岛屿数量**(标准连通块计数,注意去重) - **技巧**: - BFS队列存坐标`(x,y)`,方向数组`dirs = [(-1,0),(1,0),(0,-1),(0,1)]` - 连通判断:区域大小必须为5且所有节点可达(避免分块) **🔹 4.1-4.2:搜索综合训练** - **混合题型**: 1. **《地宫取宝》**(DFS+DP双重状态,记录当前位置和已拿宝物数) 2. **《作物杂交》**(BFS层序遍历,处理时间窗口) --- ### **第二阶段:动态规划高频突破(4.3-4.5 | 3天)** **🔹 4.3:线性DP核心** - **必学模型**: 1. **爬楼梯变种**(如《煤球数目》递推式:$a_n = a_{n-1} + n$) 2. **接龙数列**(字符串首尾匹配,状态转移:`dp[i] = max(dp[i], dp[j]+1)`) - **关键公式**: $$dp[i] = \max_{\substack{0 \leq j < i \\ \text{str}_j\text{结尾} = \text{str}_i\text{开头}}} (dp[j] + 1)$$ **🔹 4.4:背包DP精要** - **01背包模板**(滚动数组优化): ```python dp = [0]*(max_weight+1) for i in range(n): for j in range(w[i], max_weight+1): dp[j] = max(dp[j], dp[j-w[i]] + v[i]) ``` - **真题**:《砝码称重》(对称性处理:能称出`±sum`范围内的值) **🔹 4.5:DP真题强化** - **重点题**: 1. **编辑距离**(理解状态转移:增/删/改) 2. **打家劫舍变种**(环形数组处理:分两次DP取最大值) --- ### **第三阶段:数论与数据结构(4.6-4.8 | 3天)** **🔹 4.6:数论必考三件套** - **质数筛法**:埃氏筛(标记`is_prime`数组,复杂度$O(n \log \log n)$) - **因数分解**:真题《货物摆放》三步走: 1. 对N分解质因数 2. 生成所有因数列表 3. 三重循环枚举因数组合 - **GCD公式**: $$\gcd(a, b) = \gcd(b, a\%b) \quad (\text{欧几里得算法核心})$$ **🔹 4.7:并查集实战** - **模板代码**: ```python parent = list(range(n)) def find(x): if parent[x] != x: parent[x] = find(parent[x]) # 路径压缩 return parent[x] def union(x, y): root_x, root_y = find(x), find(y) if root_x != root_y: parent[root_y] = root_x ``` - **真题**:《城邦》最小生成树(Kruskal算法按边权排序后合并) **🔹 4.8:Dijkstra最短路径** - **堆优化模板**: ```python import heapq dist = [inf] * n heap = [(0, start)] while heap: d, u = heapq.heappop(heap) if d > dist[u]: continue for v, w in graph[u]: if dist[v] > d + w: dist[v] = d + w heapq.heappush(heap, (dist[v], v)) ``` - **真题**:《路径》(节点数≤2000,直接套模板) --- ### **第四阶段:贪心+冲刺模拟(4.9-4.10 | 2天)** **🔹 4.9:贪心高频题** - **《翻硬币》**:相邻字符差,局部翻转即全局最优 - **《乘积最大》**:按绝对值排序,根据负数个数奇偶调整 **🔹 4.10:全真模考+错题本** - **任务**:限时3小时完成2023年真题(重点做搜索、DP、数论题) - **错题复盘**: - DFS忘记回溯(如`visited[i]`未重置) - DP初始化错误(如`dp[0]`未赋初值) - 数论边界问题(如N=1时的质数判断) --- ### 📊 **每日学习时间分配建议** - **上午(2小时)**:学习理论 + 手写伪代码 - **下午(3小时)**:真题编码 + Debug - **晚上(1小时)**:总结模板 + 整理错题本 此计划覆盖广东B组95%+考点,放弃低频内容(如拓扑排序、复杂图论),确保每个算法能解决2-3道真题。优先保证搜索和DP的熟练度,这两部分占比赛65%分值!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值