Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
在學習前端你的小伙伴都在迷茫遇到問題,找不到老師怎么辦?這些也是小猿圈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 是一個受 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 絕對值得一試。
最近幾年,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 單元,所以不要忘了實現一個替代。
這就是今天的所有內容了,希望你會喜歡這個教程!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。