整合营销服务商

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

免费咨询热线:

使用JS把图片压缩并转成Base64的简便方法

个过程用到了画布(canvas)来帮忙完成

过程: 选择图片文件 > 准备画布 > 按需压缩图片并绘制在画布上 > 生成Base64 > 完成.

先上效果图

详细过程如下:

准备一个简洁的HTML文件, 代码如下

用一个file dom来选择图片文件

<!DOCTYPE html>
<html lang="zh-CN">
    <script type="text/javascript" src="../js/jquery.min.js"></script>
    <body>
        <input name="file" id="thumbnail" type="file" onchange="previewPic(this)"
            accept="image/x-png, image/jpg, image/jpeg, image/gif" />
    </body>
</html>

为了方便后面的代码操作, 引用了JQuery

然后准备2个容器, 一个放预览图; 另一个放Base64内容

<div>下面这个Div用来预览图片</div>
<div id="showpic" style="padding:7px;"></div>

<div>下面这个Div用来存放Base64内容</div>
<div id="picb64"></div>

接下来是灵魂:JS代码

            function previewPic(tis) {
                var fileObj = tis.files[0];         //获取图片文件对象
                if (undefined == fileObj) { console.log("未选择待上传的文件"); return; }
                var picid = "imgComp";
                $("<img>", {
                    id: picid,
                }).appendTo($("#showpic"));         //先生成IMG的DOM,以防顺序乱掉
                genCompPic(picid, fileObj);
            }
            function genCompPic(picid, fileObj) {
                var ready = new FileReader();
                /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
                ready.readAsDataURL(fileObj);
                ready.onload = function () {
                    canvasDataURL(this.result, { width: 200 }, function (base64Codes) {
                        $("#"+ picid).attr("src", base64Codes); //在IMG DOM中显示图片预览
                        $("#picb64").html(base64Codes);         //得到Base64结果,填充到Div中显示
                    })
                }
            }
            //利用canvas生成压缩后的图片
            function canvasDataURL(path, obj, callback) {
                var img = new Image();
                img.src = path;
                img.onload = function () {
                    var w = obj.width;
                    var h = obj.width / (this.width/ this.height);  //按比例压缩,计算出等比例高
                    var canvas = document.createElement('canvas');  //生成canvas
                    var ctx = canvas.getContext('2d');
                    // 创建属性节点
                    var anw = document.createAttribute("width");
                    anw.nodeValue = w;
                    var anh = document.createAttribute("height");
                    anh.nodeValue = h;
                    canvas.setAttributeNode(anw);       //设置图片宽
                    canvas.setAttributeNode(anh);       //设置图片高
                    ctx.drawImage(this, 0, 0, w, h);    //绘制图片
                    var quality = 1;  // 图片质量为0.1~1, quality值越小,所绘制出的图像越模糊
                    var base64 = canvas.toDataURL('image/jpeg', quality);   //利用canvas生成Base64
                    callback(base64);                   // 回调函数返回base64的值
                }
            }

虽然有点长, 不过关键位置都写上注释了, 大家可以参考使用

如果不想压缩图片, 在canvasDataURL方法里可以把设置宽和高的代码换成原图参数即可

完整代码

<!DOCTYPE html>
<html lang="zh-CN">
    <script type="text/javascript" src="../js/jquery.min.js"></script>
    <style>
        #picb64{width: 95%;height: 300px;overflow-wrap: break-word;overflow: auto;margin: auto;background-color: #676767;border-radius: 10px;}
    </style>
    <body>
        <input name="file" id="thumbnail" type="file" onchange="previewPic(this)"
            accept="image/x-png, image/jpg, image/jpeg, image/gif" />

        <div>下面这个Div用来预览图片</div>
        <div id="showpic" style="padding:7px;"></div>
        <div>下面这个Div用来存放Base64内容</div>
        <div id="picb64"></div>

        <script>
            function previewPic(tis) {
                var fileObj = tis.files[0];         //获取图片文件对象
                if (undefined == fileObj) { console.log("未选择待上传的文件"); return; }
                var picid = "imgComp";
                $("<img>", {
                    id: picid,
                }).appendTo($("#showpic"));         //先生成IMG的DOM,以防顺序乱掉
                genCompPic(picid, fileObj);
            }
            function genCompPic(picid, fileObj) {
                var ready = new FileReader();
                /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
                ready.readAsDataURL(fileObj);
                ready.onload = function () {
                    canvasDataURL(this.result, { width: 200 }, function (base64Codes) {
                        $("#"+ picid).attr("src", base64Codes); //在IMG DOM中显示图片预览
                        $("#picb64").html(base64Codes);         //得到Base64结果,填充到Div中显示
                    })
                }
            }
            //利用canvas生成压缩后的图片
            function canvasDataURL(path, obj, callback) {
                var img = new Image();
                img.src = path;
                img.onload = function () {
                    var w = obj.width;
                    var h = obj.width / (this.width/ this.height);  //按比例压缩,计算出等比例高
                    var canvas = document.createElement('canvas');  //生成canvas
                    var ctx = canvas.getContext('2d');
                    // 创建属性节点
                    var anw = document.createAttribute("width");
                    anw.nodeValue = w;
                    var anh = document.createAttribute("height");
                    anh.nodeValue = h;
                    canvas.setAttributeNode(anw);       //设置图片宽
                    canvas.setAttributeNode(anh);       //设置图片高
                    ctx.drawImage(this, 0, 0, w, h);    //绘制图片
                    var quality = 0.8;  // 图片质量为0.1~1, quality值越小,所绘制出的图像越模糊
                    var base64 = canvas.toDataURL('image/jpeg', quality);   //利用canvas生成Base64
                    callback(base64);                   // 回调函数返回base64的值
                }
            }
        </script>
    </body>
</html>

扩展应用: 可以利用压缩后再上传来节省带宽


本期分享就酱紫, 下期再见[看]

复杂的问题简单化

每次只关注一个知识点

对技术有兴趣的小伙伴可以关注我, 以后会经常分享各种奇奇怪怪又实用的技术知识

当今互联网时代,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 绝对值得一试。

当今数字化时代,PDF文档已成为我们传递和保存信息的重要形式之一。然而,有时候我们需要将这些PDF文档内容转换为HTML网页或图片,以便更好地展示和传播。使用首助编辑高手软件,您可以轻松实现这一目标,批量转换PDF文档为HTML网页和图片。下面,让我们一起来了解这款软件的独特功能及具体操作步骤。

一、专业且高效的PDF转换工具

它是一款专门针对PDF文档转换等强大功能的专业软件,它不仅具备高效稳定的性能,还拥有丰富的功能和工具,可以满足您各种不同的PDF转换需求。通过这款软件,您可以轻松将PDF文档批量转为HTML网页和图片,提高工作效率。

二、具体步骤:如何使用软件实现PDF文档批量转为HTML网页与图片

1.安装并启动软件,其中支持AI文章创作、魔法绘图、图片批量处理、文本批量操作,点击“PDF工具箱”功能模块。

2.如果要将文档转为html,就将格式转换切换为“pdf转html”,点击“添加文件”按钮,选择需要转换的pdf文档,支持同时添加多个文件。

3.选择新文件保存位置,支持保存在原文件相同位置,或者指定位置

4.如果选择指定位置的话,可以进入“选择新位置”窗口,选择好文件的保存路径,电脑的任意文件夹都行

5.点击“开始转换”按钮,等待软件自动完成转换过程。等转换完成,可以看到pdf文档均被转为html

6.如果想要将pdf转为图片,可以将格式转换选项切换为“pdf转图片”,再去转换,转换后一组图片一个文件夹自动分类保存着,双击文件件进去查看,pdf均被转为图片格式了

三、软件的优势特点

高效稳定:软件具备高效稳定的转换性能,可以快速批量处理大量PDF文档,保证转换过程的流畅与稳定。

多样化的输出格式:除了支持转换为HTML网页和图片外,该软件还支持其他多种格式,,满足您多样化的需求。

丰富的编辑功能:还提供了丰富的编辑工具和功能,如文本编辑、图像处理、AI文章创作、魔法绘图等等。

个性化设置:您可以右击控制面板,其中支持多种软件皮肤的选择,以满足特定的需求和喜好。

四、总结

软件以其专业高效的功能和特点,为您的PDF文档批量转为HTML网页和图片提供了便捷的解决方案。通过简单的操作步骤和强大的编辑功能,您可以轻松实现各种PDF文档的转换和处理。这款软件不仅提高了您的工作效率和质量,还为您的其他编辑和处理需求提供了全面的支持。如果您还在为繁琐的PDF转换过程烦恼,不妨尝试一下首助编辑高手软件,相信它会成为您工作中的得力助手。


上一篇:HTML的再学习
下一篇:前端基础:HTML