個過程用到了畫布(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 是一個受 JavaScript 庫 turndown.js 啟發而開發的 Rust 庫,用于將 HTML 文檔轉換為 Markdown 格式。它具有以下特點:
在使用 htmd 之前,我們需要先安裝它。將以下依賴項添加到你的 Cargo.toml 文件中:
[dependencies]
htmd = "0.1"
基本轉換
使用 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, "\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轉換過程煩惱,不妨嘗試一下首助編輯高手軟件,相信它會成為您工作中的得力助手。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。