整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

小猿圈入门html5教程之利用canvas实现图片压

小猿圈入门html5教程之利用canvas实现图片压缩方法

在学习前端你的小伙伴都在迷茫遇到问题,找不到老师怎么办?这些也是小猿圈web前端老师担心的,以后每天小猿圈都会为大家分享一些关于学习前端中的一些小问题,今天分享的是利用canvas实现图片压缩方法。

项目中做身份证识别时,需要传送图片的base64格式编码,但是手机拍摄的照片都太大了,转成base64简直可怕,因此找了一下解决办法。

涉及到的知识点

onchange事件是在上传完文件之后触发

使用files属性获取到上传的文件对象

readAsDataURL用于转换成base64编码

区分canvas的画布和绘画环境:

画布:对应代码中的cvs,可以设置画布width,height;

绘画环境:对应代码中的ctx,可以设置fillStyle,fillRect等;

使用canvas自带的drawImage()方法将图片画到canvas上

想取到压缩后图片的base64可以使用canvas自带的toDataURL()方法

完整代码

<!DOCTYPEhtml>

<htmllang="en">

<head>

<metacharset="UTF-8">

<metaname="viewport"content="width=device-width,initial-scale=1.0">

<metahttp-equiv="X-UA-Compatible"content="ie=edge">

<title>Document</title>

</head>

<body>

<inputtype="file"onchange="loadImg(this)">

<hr>

<div>800×449,544KB</div>

<imgsrc=""alt="">

<hr>

<div>400×224,157KB</div>

<canvas></canvas>

<script>

//上传图片

functionloadImg(me){

letimg=document.querySelector('img');

letcvs=document.querySelector('canvas');

letfile=me.files[0];//获取到文件对象

//上传的图片大于500KB时才压缩

if(file&&(file.size/1024>500)){

letreader=newFileReader();

reader.readAsDataURL(file);//转成base64编码

reader.onload=function(e){

letnaturalBase64=e.target.result;//获取base64编码,这是原图的

img.src=naturalBase64;

img.onload=function(){

letratio=img.naturalWidth/img.naturalHeight;//获取原图比例,为了等比压缩

cvs.width=400;

cvs.height=cvs.width/ratio;

letctx=cvs.getContext('2d');

ctx.drawImage(img,0,0,cvs.width,cvs.height);//画在canvas上

//压缩后新图的base64

letzipBase64=cvs.toDataURL();

}

}

}

}

</script>

</body>

</html>

关于压缩后的图片大小

这里提供一个开箱即用的方法,baseStr是一个完整的Base64编码

代码:

functioncalcBase(baseStr){

vartag='base64,';

baseStr=baseStr.substring(baseStr.indexOf(tag)+tag.length);

vareqTagIndex=baseStr.indexOf('=');

baseStr=eqTagIndex!=-1?baseStr.substring(0,eqTagIndex):baseStr;

varstrLen=baseStr.length;

varfileSize=strLen-(strLen/8)*2;

console.log("文件大小:"+(fileSize/1024).toFixed(1)+'KB');

}

今天的知识点就分享到这里了,有需要的朋友欢迎点赞评论转发,想了解更多web前端开发内容的朋友可以关注小猿圈的每天的动态,会不定时更新很多更好的内容奉献给大家,希望对你的学习有所帮助。

当今互联网时代,HTML 和 Markdown 都是非常流行的标记语言。HTML 用于构建网页结构和内容,而 Markdown 则以其简洁易读的语法被广泛用于编写文档、博客文章等。在很多场景下,我们需要将 HTML 内容转换为 Markdown 格式,例如网页内容抓取、文档格式转换等。

Rust 作为一门以安全、性能和可靠性著称的系统级编程语言,也提供了相应的库来处理 HTML 到 Markdown 的转换。本文将介绍一个名为 htmd 的 Rust 库,它提供了一种高效且易于使用的方式来完成这项任务。

htmd 简介

htmd 是一个受 JavaScript 库 turndown.js 启发而开发的 Rust 库,用于将 HTML 文档转换为 Markdown 格式。它具有以下特点:

  • 功能丰富: 提供了与 turndown.js 相媲美的丰富选项,可以灵活地控制转换过程。
  • 可靠性高: 通过了 turndown.js 的所有测试用例,确保转换结果的准确性。
  • 依赖项少: 仅依赖于 html5ever 库,轻量级且易于集成。
  • 性能优异: 转换速度快,能够高效处理大型 HTML 文档。

htmd 的安装

在使用 htmd 之前,我们需要先安装它。将以下依赖项添加到你的 Cargo.toml 文件中:

[dependencies]
htmd="0.1"

htmd 的使用

基本转换

使用 htmd 进行 HTML 到 Markdown 的基本转换非常简单。以下代码展示了如何将一个 <h1> 标签转换为 Markdown 中的 # 标题:

use htmd::HtmlToMarkdown;

fn main() {
    let markdown=HtmlToMarkdown::new();
    let html="<h1>这是一个标题</h1>";
    let result=markdown.convert(html).unwrap();
    assert_eq!(result, "# 这是一个标题\n");
}

跳过标签

在某些情况下,我们可能希望跳过 HTML 文档中的某些标签,例如 <script><style> 标签。htmd 提供了 skip_tags 方法来实现这一点:

use htmd::HtmlToMarkdown;

fn main() {
    let markdown=HtmlToMarkdown::builder()
        .skip_tags(vec!["script", "style"])
        .build();

    let html=r#"
        <script>
            // 一些 JavaScript 代码
        </script>
        <h1>这是一个标题</h1>
    "#;

    let result=markdown.convert(html).unwrap();
    assert_eq!(result, "# 这是一个标题\n");
}

自定义标签处理器

htmd 允许我们自定义标签处理器来处理特定的 HTML 标签。例如,我们可以定义一个处理器将 <img> 标签转换为 Markdown 中的图片语法:

use htmd::{HtmlToMarkdown, HandleResult};
use html5ever::tendril::StrTendril;
use html5ever::QualName;

fn main() {
    let markdown=HtmlToMarkdown::builder()
        .add_handler(
            vec!["img"],
            |el| {
                let src=el
                    .attrs
                    .iter()
                    .find(|(name, _)| name.local.as_ref()=="src")
                    .map(|(_, value)| value.as_ref());

                let alt=el
                    .attrs
                    .iter()
                    .find(|(name, _)| name.local.as_ref()=="alt")
                    .map(|(_, value)| value.as_ref());

                match (src, alt) {
                    (Some(src), Some(alt))=> Some(format!("![{}]({})", alt, src)),
                    _=> None,
                }
            },
        )
        .build();

    let html=r#"<img src="https://example.com/image.jpg" alt="图片描述">"#;
    let result=markdown.convert(html).unwrap();
    assert_eq!(result, "![图片描述](https://example.com/image.jpg)\n");
}

多线程处理

htmd 支持多线程处理,可以充分利用多核 CPU 的性能来加速转换过程。以下代码展示了如何使用多线程将多个 HTML 文档转换为 Markdown:

use htmd::HtmlToMarkdown;
use std::sync::Arc;
use std::thread;

fn main() {
    let markdown=Arc::new(HtmlToMarkdown::new());
    let html_docs=vec![
        "<h1>文档 1</h1>",
        "<h2>文档 2</h2>",
        "<h3>文档 3</h3>",
    ];

    let threads: Vec<_>=html_docs
        .into_iter()
        .map(|html| {
            let markdown=markdown.clone();
            thread::spawn(move || {
                let result=markdown.convert(html).unwrap();
                println!("{}", result);
            })
        })
        .collect();

    for thread in threads {
        thread.join().unwrap();
    }
}

结论

htmd 是一个功能强大且易于使用的 Rust 库,用于将 HTML 文档转换为 Markdown 格式。它提供了丰富的选项、自定义标签处理器和多线程支持,可以满足各种转换需求。如果你正在寻找一种高效可靠的 HTML 到 Markdown 转换解决方案,htmd 绝对值得一试。

最近几年,Web前端开发的最热领域当属HTML5,HTML5技术已经从根本上改变了开发商开发web应用的方式,从桌面的浏览器开始到移动端的应用,这种语言和标准都正在不断的影响,并将持续影响着各种各样的操作平台。

这篇文章将向大家介绍一些最基本也非常必要的HTML技巧。

1. 新的文档类型(Doctype)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

你还在使用上面这个既麻烦又难记的XHTML文档类型吗? 如果还是这样的话,现在该切换到新的HTML5文档类型了。

<!DOCTYPE html>

只要这么简单的15个字符就可以了。(注意:你的doctype的申明需要出现在你html文件的第一行。)

2. 图形(Figure)元素

考虑用下面的代码来标记图片?

<mg src="path/to/image" alt="About image" />

<p>Image of Mars. </p>

很不幸,它不能用简单、富有语义关联的方式与图形的标题关联,因为它仅仅是用段落标记以及图片元素包裹着,而HTML5通过引进<figure>元素,改进了这一点。当结合 <figcaption> 元素使用时,我们就可以将图形标题与图形配对起来。代码如下:

<figure>

<img src="path/to/image" alt="About image" />

<figcaption>

<p>This is an image of something interesting. </p>

</figcaption>

</figure>

3.布局

当创建一个响应式网站,或让现有的网站变成响应式的,首先要关注的元素的布局。我在建立响应式的网站,总是先创建一个非响应的布局,页面宽度固定大小。如果非响应版本完成得非常不错,我再添加媒体查询(Media Queries)和响应式代码。这种操作方式更容易实现响应式特性,在同一时间专注于一个任务。

当你已经完成了无响应的网站,做的第一件事是在你的 HTML 页面,粘贴下面的代码到<head>和</head>标签之间。这将设置屏幕按1:1的尺寸显示,在 iPhone 和其他智能手机的浏览器提供网站全视图浏览,并禁止用户缩放页面。

1.<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">

2.<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

3.<meta name="HandheldFriendly" content="true">

现在是时候添加一些媒体查询了。根据 W3C 网站,媒体查询由媒体类型和零个或多个媒体查询的条件表达式组成。通过使用媒体查询,外观呈现可以针对特定范围内的输出设备,而不需要改变内容本身。换句 话说,媒体查询让您的网站在各种各种显示器上看起来都很好,从小的智能手机到大的电脑屏幕等等。

媒体查询取决于你的网站布局,所以对我来说为您提供一个现成可以使用的代码片段有点困难。但是,下面的代码对于大多数网站都是一个很好的起点。在这个例子中,#primary 是主要内容区域,#secondary 是侧栏。

从代码中你可以看到,我定义了两种规格:首先有一个最大宽度为1060px,为平板电脑优化的横向显示。#primary 占在其父容器宽度的67%,#senondary 占30%,再加上3%的左外边距。 第二个规格是用于平板电脑和更小的屏幕尺寸。

由于智能手机的屏幕尺寸小,我决定给 #primary 设置100%的宽度,#secondary 也设置100%的宽度,他将在 #primary 下面。 正如我已经说过的,你可能必须要对这段代码位进行修改才能适应您的网站的具体需求。

1./* Tablet Landscape */

2.@media screen and (max-width: 1060px) {

3. #primary { width:67%; }

4. #secondary { width:30%; margin-left:3%;}

5.}

6./* Tabled Portrait */

7.@media screen and (max-width: 768px) {

8. #primary { width:100%; }

9. #secondary { width:100%; margin:0; border:none; }

10.}

完成以后,让我们看看你的布局是如何响应的。要做到这一点,我用这 Matt Kersley 创建的一款非常的响应式测试工具。

四 字体

本教程的最后一步绝对非常重要,但往往被网站开发人员忽视——字体。到现在为止,大多数开发人员(包括我自己)使用像素来定义字体的大小。虽然像素在普通 网站使用是OK的,但是对于响应式网站来说应该有响应式的字体。事实上,一个响应式的字体大小应关联它的父容器的宽度,这样它才可以适应客户端的屏幕。

CSS3 规范引入了一个新的单位叫 rem,和 em 类相似,但相对于 HTML 元素来说, rem 更易于使用。

rem 是相对于 HTML 元素的,不要忘了重置 HTML 的字体大小:

1.html { font-size:100%; }

完成后,您可以定义响应式的字体大小,如下所示:

1.@media (min-width: 640px) { body {font-size:1rem;} }

2.@media (min-width:960px) { body {font-size:1.2rem;} }

3.@media (min-width:1100px) { body {font-size:1.5rem;} }

请注意,旧浏览器不支持 rem 单元,所以不要忘了实现一个替代。

  这就是今天的所有内容了,希望你会喜欢这个教程!