webp.html 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>webp</title>
  6. <style>
  7. #image-display {
  8. max-width: 100%;
  9. max-height: 100%;
  10. border: 1px solid gray;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <h1>粘贴图片并展示</h1>
  16. <p>右键粘贴图片,本地图片或网络图片地址都可以,将被压缩为webp格式并展示,压缩前:<span id="preSize"></span>, 压缩后:<span id="afterSize"></span><span id="status"></span>&nbsp;。&nbsp;<button onclick="rotateImage()">旋转90度</button>
  17. </p>
  18. <div id="image-container">
  19. <img id="image-display" src="" alt="Image Display">
  20. </div>
  21. <script>
  22. const imageDisplay = document.getElementById("image-display");
  23. function formatSize(sizeInBytes) {
  24. const sizeInKb = sizeInBytes / 1024;
  25. const sizeInMb = sizeInBytes / 1048576;
  26. if (sizeInMb >= 1) {
  27. return `${sizeInMb.toFixed(2)} MB`;
  28. } else {
  29. return `${sizeInKb.toFixed(2)} KB`;
  30. }
  31. }
  32. // 监听粘贴事件
  33. document.addEventListener("paste", (event) => {
  34. handleClipboardItems(event.clipboardData.items);
  35. });
  36. // 监听拖拽事件
  37. document.addEventListener("dragover", (event) => {
  38. event.preventDefault();
  39. });
  40. document.addEventListener("drop", (event) => {
  41. event.preventDefault();
  42. handleClipboardItems(event.dataTransfer.items);
  43. });
  44. function compressImage(blobFile, quality = 0.8) {
  45. // 返回一个Promise对象
  46. return new Promise((resolve, reject) => {
  47. // 创建一个Image对象
  48. const image = new Image();
  49. // 当Image对象加载完成时,执行以下操作
  50. image.onload = () => {
  51. const canvas = document.createElement("canvas");
  52. canvas.width = image.naturalWidth;
  53. canvas.height = image.naturalHeight;
  54. const context = canvas.getContext("2d");
  55. context.drawImage(image, 0, 0);
  56. canvas.toBlob((webpBlob) => {
  57. // 解决Promise,并传递压缩后的Blob对象
  58. resolve(webpBlob);
  59. }, "image/webp", quality);
  60. // 如果在转换过程中发生错误,拒绝Promise
  61. };
  62. image.src = URL.createObjectURL(blobFile);
  63. });
  64. }
  65. // 处理粘贴板或拖拽项
  66. function handleClipboardItems(items) {
  67. if (!items) {
  68. return;
  69. }
  70. // 查找图片数据
  71. for (let i = 0; i < items.length; i++) {
  72. if (items[i].type.indexOf("image") !== -1) {
  73. document.getElementById("preSize").innerText = "";
  74. document.getElementById("afterSize").innerText = "";
  75. // 获取图片文件或URL
  76. const blobFile = items[i].getAsFile();
  77. // 将图片展示
  78. document.getElementById("status").innerText = " 压缩中……";
  79. document.getElementById("preSize").innerText = formatSize(blobFile.size);
  80. // 压缩为webp格式
  81. compressImage(blobFile).then((webpBlob) => {
  82. let size = webpBlob.size;
  83. // 如果图片大于300kb,再次压缩
  84. if (size > 300 * 1024) {
  85. compressImage(webpBlob, 0.5).then((webpBlob2) => {
  86. size = webpBlob2.size;
  87. // 将压缩后的webp图片展示在页面上
  88. imageDisplay.src = URL.createObjectURL(webpBlob2);
  89. showSize(webpBlob2);
  90. });
  91. return;
  92. }
  93. // 将压缩后的webp图片展示在页面上
  94. imageDisplay.src = URL.createObjectURL(webpBlob);
  95. showSize(webpBlob);
  96. });
  97. // 防止页面跳转
  98. event.preventDefault();
  99. break
  100. }
  101. }
  102. }
  103. function showSize(webpBlob){
  104. document.getElementById("status").innerText = " 已压缩 ☺";
  105. document.getElementById("afterSize").innerText = formatSize(webpBlob.size);
  106. }
  107. // 选择90度旋转
  108. function rotateImage() {
  109. const image = document.getElementById("image-display");
  110. const canvas = document.createElement("canvas");
  111. const context = canvas.getContext("2d");
  112. // 旋转90度
  113. canvas.width = image.height;
  114. canvas.height = image.width;
  115. context.rotate(90 * Math.PI / 180);
  116. context.drawImage(image, 0, -canvas.width);
  117. // 将旋转后的图片展示在页面上
  118. const rotatedImageUrl = canvas.toDataURL();
  119. image.src = rotatedImageUrl;
  120. }
  121. </script>
  122. </body>
  123. </html>