webp.html 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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></p>
  17. <div id="image-container">
  18. <img id="image-display" src="" alt="Image Display">
  19. </div>
  20. <script>
  21. const imageDisplay = document.getElementById("image-display");
  22. function formatSize(sizeInBytes) {
  23. const sizeInKb = sizeInBytes / 1024;
  24. const sizeInMb = sizeInBytes / 1048576;
  25. if (sizeInMb >= 1) {
  26. return `${sizeInMb.toFixed(2)} MB`;
  27. } else {
  28. return `${sizeInKb.toFixed(2)} KB`;
  29. }
  30. }
  31. // 监听粘贴事件
  32. document.addEventListener("paste", (event) => {
  33. handleClipboardItems(event.clipboardData.items);
  34. });
  35. // 监听拖拽事件
  36. document.addEventListener("dragover", (event) => {
  37. event.preventDefault();
  38. });
  39. document.addEventListener("drop", (event) => {
  40. event.preventDefault();
  41. handleClipboardItems(event.dataTransfer.items);
  42. });
  43. // 处理粘贴板或拖拽项
  44. function handleClipboardItems(items) {
  45. if (!items) {
  46. return;
  47. }
  48. // 查找图片数据
  49. for (let i = 0; i < items.length; i++) {
  50. if (items[i].type.indexOf("image") !== -1) {
  51. document.getElementById("preSize").innerText = "";
  52. document.getElementById("afterSize").innerText = "";
  53. // 获取图片文件或URL
  54. const blob = items[i].getAsFile();
  55. const imageUrl = URL.createObjectURL(blob);
  56. // 将图片展示
  57. imageDisplay.src = imageUrl;
  58. document.getElementById("status").innerText = " 压缩中……";
  59. document.getElementById("preSize").innerText = formatSize(blob.size);
  60. // 压缩为webp格式
  61. const image = new Image();
  62. image.onload = () => {
  63. const canvas = document.createElement("canvas");
  64. canvas.width = image.naturalWidth;
  65. canvas.height = image.naturalHeight;
  66. const context = canvas.getContext("2d");
  67. context.drawImage(image, 0, 0);
  68. canvas.toBlob((webpBlob) => {
  69. // 将压缩后的webp图片展示在页面上
  70. const webpUrl = URL.createObjectURL(webpBlob);
  71. imageDisplay.src = webpUrl;
  72. // 转换为base64编码
  73. const reader = new FileReader();
  74. reader.onloadend = () => {
  75. // You can further process or use the base64Data as needed
  76. document.getElementById("status").innerText = " 已压缩 ☺";
  77. document.getElementById("afterSize").innerText = formatSize(webpBlob.size);
  78. imageDisplay.src = reader.result;
  79. };
  80. reader.readAsDataURL(webpBlob);
  81. }, "image/webp", 0.8);
  82. };
  83. image.src = imageUrl;
  84. // 防止页面跳转
  85. event.preventDefault();
  86. break
  87. }
  88. }
  89. }
  90. // 选择90度旋转
  91. function rotateImage() {
  92. const image = document.getElementById("image-display");
  93. const canvas = document.createElement("canvas");
  94. const context = canvas.getContext("2d");
  95. // 旋转90度
  96. canvas.width = image.height;
  97. canvas.height = image.width;
  98. context.rotate(90 * Math.PI / 180);
  99. context.drawImage(image, 0, -canvas.width);
  100. // 将旋转后的图片展示在页面上
  101. const rotatedImageUrl = canvas.toDataURL();
  102. image.src = rotatedImageUrl;
  103. }
  104. </script>
  105. </body>
  106. </html>