Vue.js 2.0モバイル写真圧縮画像アップロードプレビュー機能

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

もともと、モバイル端末はH5アプリケーションを開発し、muiフレームワークとVue.js + vue-router + vuexファミリーバケットを組み合わせて写真を撮る準備をしていました。アップロード処理中にH5 +インタフェースを呼び出すことはできませんので、最後の写真アップロード機能は入力ファイル方式を使用して解決します。 しかし、私の心はまだ調和していません。プロジェクトが進行し、反復が実行されると、私はあきらめる必要があります。将来、私はこの関数を使ってH5 +インタフェースを呼び出すことができます。

まず、このカメラプレビュー圧縮アップロードを実装するアイデアについて説明しましょう。正確に言えば、写真のプレビューとアップロード、または画像圧縮の選択が必要です。 写真を撮るか、毎回画像を選択してから画像を圧縮して、アップロードをプレビューします。 アップロードの画像圧縮プラグインはlocalResizeIMGですが、このプラグインの使用方法はwikiを見ることができます。基本原理はcanvasを通して画像をレンダリングし、toDataURLメソッドの圧縮効果を使ってbase64文字列(jpg形式の画像としてコンパイルできます) Iosが2MB以上のカメラの圧縮を行うには60-80kb程度ですが、歪みはそれほど深刻ではありませんが、私のプロジェクトでは写真のようにはっきりと見えるので、そこにコードを貼り付けてデモンストレーションします。


<template>
<h5 class="content-header">图片列表</h5>
<div class="image-list">
<div class="list-default-img" v-show="isPhoto" @click.stop="addPic">
<img src="./images/icon_photo.png" />
<span>请选择或者拍照上传照片</span>
<input type="file" accept="image/jpeg,image/jpg,image/png" capture="camera" @change="onFileChange" style="display: none;">
</div>
<ul class="list-ul" v-show="!isPhoto">
<li class="list-li" v-for="(iu, index) in imgUrls">
<a class="list-link" @click='previewImage(iu)'>
<img :src="iu">
</a>
<span class="list-img-close" @click='delImage(index)'></span>
</li>
<li class="list-li-add">
<span class="add-img" @click.stop="addPic"></span>
</li>
</ul>
</div>
<div class="add-preview" v-show="isPreview" @click="closePreview">
<img :src="previewImg">
</div>
</template>
<script>
export default {
data: function () {
return {
imgUrls: [],
urlArr: [],
isPhoto: true,
btnTitle: '',
isModify: false,
previewImg:'',
isPreview: false
}
},
watch: {
imgUrls: 'toggleAddPic'
},
methods: {
toggleAddPic: function() {
let vm = this;
if(vm.imgUrls.length >= 1) {
vm.isPhoto = false;
} else {
vm.isPhoto = true;
}
},
addPic: function(e) {
let vm = this;
$('input[type=file]').trigger('click');
return false;
},
onFileChange: function(e) {
var files = e.target.files || e.dataTransfer.files;
if(!files.length) return;
this.createImage(files, e);
},
createImage: function(file, e) {
let vm = this;
lrz(file[0], { width: 480 }).then(function(rst) {
vm.imgUrls.push(rst.base64);
return rst;
}).always(function() {
// 清空文件上传控件的值
e.target.value = null;
});
},
delImage: function(index) {
let vm = this;
let btnArray = ['取消', '确定'];
mui.confirm('确定删除该图片?','提示', btnArray, function(e) {
if (e.index == 1) {
vm.imgUrls.splice(index, 1);
}
})
},
previewImage: function(url){
let vm = this;
vm.isPreview = true;
vm.previewImg = url;
},
closePreview: function(){
let vm = this;
vm.isPreview = false;
vm.previewImg = "";
},
saveImage: function(){
let vm = this;
let urlArr = [],
imgUrls = this.imgUrls;
for(let i = 0; i < imgUrls.length; i++) {
if(imgUrls[i].indexOf('file') == -1) {
urlArr.push(imgUrls[i].split(',')[1]);
} else {
urlArr.push(imgUrls[i]);
}
}
//数据传输操作
}
}
}
</script>

1.写真をクリックするか、画像を選択します。addPic

vue.jsで写真を撮り、写真を選択することは頻繁に行われます。一度に写真を撮ったり、写真を選択したり、複数のアップロードをしたり、.stop修飾子でクリックイベントを使用したり、ストップコールイベントを使用することができます。 stopPropagation()はバブリングを止めることです。 Acceptは、ファイルアップロードによって提出されたファイルのタイプを指定することです。キャプチャは、WebApp、カメラカメラ、ビデオカメラ、カメラ、およびマイクでキャプチャされたシステムデフォルトデバイスです。

トリガされたカメラアクションonFileChangeにchangeイベントをバインドしてファイルファイルオブジェクトを取得し、lrzメソッドを呼び出して画像を圧縮し、base64形式の画像をimgUrls配列に追加します。


lrz(file[0], { width: 480 }).then(function(rst) {
vm.imgUrls.push(rst.base64);
return rst;
}).always(function() {
// 清空文件上传控件的值
e.target.value = null;
});
lrz(file, [options]);

File:input:fileで取得したファイル、またはイメージパスに直接入力したファイル。

[options]:このパラメータは無視できます。

Width {Number}イメージの最大幅。デフォルトの幅は元のイメージで、高さが設定されていない場合は幅に適応します。
高さ{数}上記と同じです。
Quality {Number}画像の圧縮品質、0〜1の値、デフォルトは0.7です。
fieldName {String}バックエンドによって受信されたフィールドの名前です。

結果は約束オブジェクトであり、then()、catch()、alwaysメソッドがあります。

それから(最初):

バックエンドが処理できるrst.formDataデータ。
Rst.file圧縮ファイルオブジェクト(デフォルトではrst.formDataで失われています)は、圧縮率が低すぎる場合は元のファイルオブジェクトになります。
rst.fileLen生成されたイメージのサイズ。バックエンドはこの値を使用して、転送が完了しているかどうかを確認できます。
Rst.base64は画像base64を生成し、バックエンドはこの文字列を画像として扱うことができますが、img.src = base64でも直接処理できます。
rst.base64Len生成されたbase64のサイズ。バックエンドは、この値を使用して、送信が完了したかどうかを確認できます(base64アップロード方法が使用されている場合)。
Rst.originは元のファイルオブジェクトでもあり、サイズ、日付などの生ファイル情報が含まれています。

Catch(err)、always()。

注:画像をアップロードするために写真をクリックし続けるかもしれないので、アップロードコントロールの値は変更コールバック関数でクリアする必要があります。


// 清空文件上传控件的值
e.target.value = null; 

2. DOM表示をクリックして最初の写真を撮り、プレビューを表示して写真を撮るisPhoto

デフォルトのisPhotoはtrueです。DOM表示の写真を引き続き表示するには非表示にしてください。toggleAddPicは、現在選択されているimgUrls配列の長さをリッスンします。変換isPhoto boolean 1つ以上のピクチャ設定isPhotoがfalseの場合はクリックして最初の写真DOMを撮影し、 DOM;画像がない場合は、最初の写真DOMを撮影して表示するDOMを非表示にします。

3.選択した圧縮イメージdelImageを削除します。

配列の対応するインデックスに従って、対応する画像データがimgUrlsで削除されます。


delImage: function(index) {
let vm = this;
let btnArray = ['取消', '确定'];
mui.confirm('确定删除该图片?','提示', btnArray, function(e) {
if (e.index == 1) {
vm.imgUrls.splice(index, 1);
}
})
}

4.既に圧縮された画像の大きな画像プレビューと大きな画像のプレビューを閉じるisPreview previewImage closePreview

ここで大きな画像のプレビューは、プレビューを閉じるために画像自体をクリックするプレビューDOM img srcズーム表示に直接base64形式の画像を置くことです、空のimg srcリソース。

5. base64イメージ転送の前にsaveImageを処理する


saveImage: function(){
let vm = this;
let urlArr = [],
imgUrls = this.imgUrls;
for(let i = 0; i < imgUrls.length; i++) {
if(imgUrls[i].indexOf('file') == -1) {
urlArr.push(imgUrls[i].split(',')[1]);
} else {
urlArr.push(imgUrls[i]);
}
}
//数据传输操作
}

私はBase64の文字列に圧縮されてバックエンドを処理するために、ここで私はここで背景を編集するために、 "data:image / jpeg; base64、~~" Jpeg; base64 "は切り捨てられ、バックコンマの後にbase64文字列にのみ渡されます。

注:バックエンドが私が渡すbase64文字列の配列を受け取ると、urlencodeされ、バックエンドがbase64文字列をイメージとして処理している場合、標準のbase64の文字が%xxに変換されます。特殊文字をフィルタリングする必要があります。


public ActionResult MUploadImgBase64Str(string base64str)
{
try
{
var imgData = base64str;
//过滤特殊字符即可 
string dummyData = imgData.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+");
if (dummyData.Length % 4 > 0)
{
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
}
byte[] byteArray = Convert.FromBase64String(dummyData);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray))
{
var img = System.Drawing.Image.FromStream(ms);
var path = "~/Content/UploadFiles/mobile/";
var uploadpath = Server.MapPath(path);
if (!Directory.Exists(uploadpath))
{
Directory.CreateDirectory(uploadpath);
}
var saveName = uploadpath + “stoneniqiu” + ".jpg";
img.Save(saveName);
return Json(saveName);
}
}
catch (Exception e)
{
return Json(e.Message);
}
}

上記は、Xiaobianが皆に紹介したVue.js 2.0の動画像の圧縮画像のアップロードとプレビュー機能です。皆様に役立つことを願っております。ご不明な点がございましたら、私にメッセージを残してください。 スクリプトホームサイトのご支援ありがとうございました!


1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ