Saya ingin memeriksa transparansi gambar dan menampilkan pesan kesalahan jika latar belakang gambar tidak transparan. Saya memiliki function hasAlpha(file)
untuk memeriksanya file memiliki latar belakang transparan tetapi saya tidak yakin bagaimana untuk melewatinya melalui function uploadFile(file)
fungsi yang sudah memeriksa ukuran file.
Saya pikir saya dapat menduplikasi if
pernyataan ukuran file di dalam if (xhr.upload) {}
dan memeriksa apakah gambar yang diunggah transparan tetapi saya tidak yakin bagaimana cara memasukkan function hasAlpha(file)
dengan sisa kode.
// File Upload
//
function ekUpload() {
function Init() {
console.log("Upload Initialised");
var fileSelect = document.getElementById("file-upload"),
fileDrag = document.getElementById("file-drag"),
submitButton = document.getElementById("submit-button");
fileSelect.addEventListener("change", fileSelectHandler, false);
// Is XHR2 available?
var xhr = new XMLHttpRequest();
if (xhr.upload) {
// File Drop
fileDrag.addEventListener("dragover", fileDragHover, false);
fileDrag.addEventListener("dragleave", fileDragHover, false);
fileDrag.addEventListener("drop", fileSelectHandler, false);
}
}
function fileDragHover(e) {
var fileDrag = document.getElementById("file-drag");
e.stopPropagation();
e.preventDefault();
fileDrag.className =
e.type === "dragover" ? "hover" : "modal-body file-upload";
}
function fileSelectHandler(e) {
// Fetch FileList object
var files = e.target.files || e.dataTransfer.files;
// Cancel event and hover styling
fileDragHover(e);
// Process all File objects
for (var i = 0, f;
(f = files[i]); i++) {
parseFile(f);
uploadFile(f);
}
}
// Output
function output(msg) {
// Response
var m = document.getElementById("messages");
m.innerHTML = msg;
}
function hasAlpha(file) {
var canvas = file.getElementById("file-image");
var ctx = canvas.getContext("2d");
var data = file.getImageData(0, 0, canvas.width, canvas.height).data,
hasAlphaPixels = false;
for (var i = 3, n = data.length; i < n; i += 4) {
if (data[i] < 255) {
hasAlphaPixels = true;
break;
}
}
return hasAlphaPixels;
}
function parseFile(file) {
console.log(file.name);
output("<strong>" + encodeURI(file.name) + "</strong>");
// var fileType = file.type;
// console.log(fileType);
var imageName = file.name;
var isGood = /\.(?=svg|jpg|png|jpeg)/gi.test(imageName);
if (isGood) {
document.getElementById("start").classList.add("hidden");
document.getElementById("response").classList.remove("hidden");
document.getElementById("notimage").classList.add("hidden");
// Thumbnail Preview
document.getElementById("file-image").classList.remove("hidden");
document.getElementById("file-image").src = URL.createObjectURL(file);
} else {
document.getElementById("file-image").classList.add("hidden");
document.getElementById("notimage").classList.remove("hidden");
document.getElementById("start").classList.remove("hidden");
document.getElementById("response").classList.add("hidden");
document.getElementById("file-upload-form").reset();
}
}
function uploadFile(file) {
var xhr = new XMLHttpRequest(),
fileInput = document.getElementById("class-roster-file"),
fileSizeLimit = 1024; // In MB
if (xhr.upload) {
// Check if file is less than x MB
if (file.size <= fileSizeLimit * 1024 * 1024) {
// File received / failed
xhr.onreadystatechange = function(e) {
if (xhr.readyState == 4) {
// Everything is good!
// document.location.reload(true);
}
};
// Start upload
xhr.open(
"POST",
document.getElementById("file-upload-form").action,
true
);
xhr.setRequestHeader("X-File-Name", file.name);
xhr.setRequestHeader("X-File-Size", file.size);
xhr.setRequestHeader("Content-Type", "multipart/form-data");
xhr.send(file);
} else {
output("Please upload a smaller file (< " + fileSizeLimit + " MB).");
}
}
}
// Check for the various File API support.
if (window.File && window.FileList && window.FileReader) {
Init();
} else {
document.getElementById("file-drag").style.display = "none";
}
}
ekUpload();
form {
display: flex;
flex-direction: column;
justify-content: center;
align-items: left;
border: 1px solid;
cursor: pointer;
height: 90px;
}
img {
border: 1px solid;
height: 60px;
width: 60px;
}
.uploader input[type="file"],
.hidden {
display: none;
}
<!-- Upload -->
<form id="file-upload-form" class="uploader">
<input id="file-upload" type="file" name="fileUpload" accept="image/*" />
<label for="file-upload" id="file-drag">
<img id="file-image" src="#" alt="Preview" class="hidden">
<div id="start">
<i class="fa fa-download" aria-hidden="true"></i>
<div>Select a file or drag here</div>
<div id="notimage" class="hidden">Please select an image</div>
</div>
<div id="response" class="hidden">
<div id="messages"></div>
</div>
</label>
</form>
<div class="error hidden">Your logo must have a transparent background. Please set RBGa
javascript
Kyle Underhill
sumber
sumber
Jawaban:
Saya memodifikasi / memperbaiki
hasAlpha()
fungsi Anda . Ini mengembalikan janji yang diselesaikan pada acara pemuatan gambar atau menolak pada acara kesalahan gambar. Saya juga menambahkan<canvas>
elemen tersembunyi , yang digunakan oleh fungsi ini. Saya menambahkanfileSelectHandler()
fungsi pemeriksaan transparansi , memindahkannya ke tempat lain jika diperlukan.Kode:
sumber
canvas
memungkinkan untuk SVG? Saya menerima galat berikut 'getImageData' di 'CanvasRenderingContext2D': Kanvas telah dinodai oleh data lintas asal. "img..crossOrigin = "Anonymous"
harus menyelesaikan masalah yang disebutkan oleh Anda. Saya memperbaikinya dari huruf kecil 'anonim' ke huruf besar. Silakan periksa cuplikan saya