PixelPlace Image Overlayer

Place images on pixelplace.io

  1. // ==UserScript==
  2. // @name PixelPlace Image Overlayer
  3. // @namespace http://tampermonkey.net/
  4. // @version v3
  5. // @description Place images on pixelplace.io
  6. // @author Ghost
  7. // @match https://pixelplace.io/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13.  
  14. let image = document.createElement('img');
  15. image.style.position = 'absolute';
  16. image.style.opacity = '0.5'; // 50% transparent by default
  17. let imageSize = 100; // Initial image size
  18. let imageUrl = ''; // URL for image
  19. let originalImageUrl = ''; // Original URL for image
  20. let locked = false; // Image lock state
  21. let lockImageUrl = 'https://i.imgur.com/RmYtAGW.jpg'; // URL for lock image
  22. let copyrightElement = document.getElementById('copyright');
  23.  
  24. // Create buttons for resizing and uploading images
  25. let uploadButton = createButton('Upload Image', '150px', '10%', '-50%', 'translateY(-50%)');
  26. let biggerButton = createButton('Bigger', '150px', '25%', '-50%', 'translateY(-50%)');
  27. let smallerButton = createButton('Smaller', '150px', '40%', '-50%', 'translateY(-50%)');
  28. let lockButton = createButton('Lock Image', '150px', '55%', '-50%', 'translateY(-50%)');
  29. // Create opacity slider
  30. let opacitySlider = createSlider('Opacity', '150px', '70%', '-50%', 'translateY(-50%)');
  31.  
  32. // Create menu button
  33. let menuButton = createButton('Menu', '80px', '5%', '-50%', 'translateY(-50%)');
  34. menuButton.style.display = ''; // Ensure menu button is visible initially
  35.  
  36. // Function to create a button
  37. function createButton(text, width, top, topTranslation, transform) {
  38. let button = document.createElement('button');
  39. button.textContent = text;
  40. button.style.position = 'fixed';
  41. button.style.left = '50%';
  42. button.style.transform = 'translateX(-50%) ' + transform; // Center horizontally
  43. button.style.width = width;
  44. button.style.top = top;
  45. button.style.display = 'none'; // Initially invisible
  46. // Adding rainbow outline to the buttons
  47. button.style.outline = '3px solid transparent';
  48. button.style.outlineOffset = '-3px';
  49. button.style.animation = 'rainbow 2s infinite';
  50. document.body.appendChild(button);
  51. return button;
  52. }
  53.  
  54. // Function to create a slider
  55. function createSlider(text, width, top, topTranslation, transform) {
  56. let label = document.createElement('label');
  57. label.textContent = text;
  58. label.style.position = 'fixed';
  59. label.style.left = '50%';
  60. label.style.transform = 'translateX(-50%) ' + transform; // Center horizontally
  61. label.style.width = width;
  62. label.style.top = top;
  63. label.style.display = 'none'; // Initially invisible
  64.  
  65. let slider = document.createElement('input');
  66. slider.type = 'range';
  67. slider.min = '0';
  68. slider.max = '100';
  69. slider.value = '50'; // Starting at 50% opacity
  70. slider.style.width = '100%';
  71. slider.style.position = 'absolute';
  72. slider.style.left = '0';
  73. slider.style.top = '20px'; // Position below the label
  74. slider.style.outline = '1px solid blue'; // Adding outline to the slider
  75. slider.style.display = 'none'; // Initially invisible
  76.  
  77. label.appendChild(slider);
  78. document.body.appendChild(label);
  79.  
  80. return slider;
  81. }
  82.  
  83. // Function to toggle the visibility of other buttons
  84. function toggleMenu() {
  85. let buttons = [uploadButton, biggerButton, smallerButton, lockButton, opacitySlider];
  86. for (let button of buttons) {
  87. button.style.display = button.style.display === 'none' ? '' : 'none';
  88. }
  89. opacitySlider.parentNode.style.display = opacitySlider.parentNode.style.display === 'none' ? '' : 'none';
  90. }
  91.  
  92. // Event listener for menu button
  93. menuButton.addEventListener('click', toggleMenu);
  94.  
  95. // Function to place the image at the clicked position
  96. function placeImage(event) {
  97. if (!locked && imageUrl) {
  98. const x = event.clientX + window.scrollX;
  99. const y = event.clientY + window.scrollY;
  100. image.src = imageUrl;
  101. image.style.left = x + 'px';
  102. image.style.top = y + 'px';
  103. image.style.width = imageSize + 'px';
  104. // Adding rainbow outline to the submitted image
  105. image.style.outline = '3px solid transparent';
  106. image.style.outlineOffset = '-3px';
  107. image.style.boxShadow = '0 0 0 3px white inset'; // Adding white inset outline
  108. image.style.animation = 'rainbow 2s infinite';
  109. document.body.appendChild(image);
  110. }
  111. }
  112.  
  113. // Function to toggle image lock
  114. function toggleLock() {
  115. locked = !locked;
  116. if (!locked) {
  117. image.src = originalImageUrl; // Restore original image when unlocked
  118. }
  119. updateOpacity(); // Update opacity only if the image is not locked
  120. updateCopyright();
  121. }
  122.  
  123. // Function to update the opacity based on lock state and slider
  124. function updateOpacity() {
  125. if (!locked) {
  126. let opacityValue = opacitySlider.value;
  127. image.style.opacity = opacityValue / 100; // Convert to 0-1 range for CSS
  128. }
  129. }
  130.  
  131. // Function to update the text in the copyright element
  132. function updateCopyright() {
  133. if (locked) {
  134. copyrightElement.textContent = 'Image Locked';
  135. copyrightElement.style.color = 'red';
  136. } else {
  137. copyrightElement.textContent = 'Image Not Locked';
  138. copyrightElement.style.color = 'green';
  139. }
  140. }
  141.  
  142. // Event listener for mouse click to place the image
  143. document.addEventListener('click', placeImage);
  144.  
  145. // Event listener for resizing the image bigger
  146. biggerButton.addEventListener('click', function() {
  147. imageSize += 10;
  148. image.style.width = imageSize + 'px';
  149. });
  150.  
  151. // Event listener for resizing the image smaller
  152. smallerButton.addEventListener('click', function() {
  153. if (imageSize > 10) {
  154. imageSize -= 10;
  155. image.style.width = imageSize + 'px';
  156. }
  157. });
  158.  
  159. // Event listener for uploading an image
  160. uploadButton.addEventListener('click', function() {
  161. const fileInput = document.createElement('input');
  162. fileInput.type = 'file';
  163. fileInput.accept = 'image/*';
  164. fileInput.addEventListener('change', function() {
  165. const file = fileInput.files[0];
  166. const reader = new FileReader();
  167. reader.onload = function(e) {
  168. imageUrl = e.target.result;
  169. originalImageUrl = imageUrl; // Store original image URL
  170. if (!locked && imageUrl) {
  171. image.src = imageUrl;
  172. image.style.width = imageSize + 'px';
  173. }
  174. };
  175. reader.readAsDataURL(file);
  176. });
  177. fileInput.click();
  178. });
  179.  
  180. // Event listener for locking/unlocking the image
  181. lockButton.addEventListener('click', toggleLock);
  182.  
  183. // Event listener for the opacity slider
  184. opacitySlider.addEventListener('input', function() {
  185. updateOpacity(); // Adjust opacity in real-time
  186. });
  187.  
  188. // Event listener for keyboard controls
  189. document.addEventListener('keydown', function(event) {
  190. // Down arrow key: Toggle image lock
  191. if (event.key === 'ArrowDown') {
  192. toggleLock();
  193. }
  194. });
  195.  
  196. // Prevent interactions with elements behind the image
  197. image.addEventListener('mousedown', function(event) {
  198. event.stopPropagation();
  199. });
  200.  
  201. // Ensure mouse events pass through the image
  202. image.style.pointerEvents = 'none';
  203.  
  204. // Initialize the copyright text
  205. updateCopyright();
  206. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址