Có cách nào để kiểm tra xem điểm (x, y) đã chọn của hình ảnh PNG có trong suốt không?Làm cách nào để có được màu phối hợp x, y của một ảnh?
Trả lời
Xây dựng dựa trên câu trả lời của Jeff, bước đầu tiên của bạn là tạo đại diện canvas cho PNG của bạn. Sau đây tạo ra một khung hình có chiều rộng và chiều cao giống như hình ảnh của bạn và có hình ảnh được vẽ trên đó.
var img = document.getElementById('my-image');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
Sau đó, khi người dùng nhấp, sử dụng event.offsetX
và event.offsetY
để có được vị trí này. Điều này sau đó có thể được sử dụng để có được các điểm ảnh:
var pixelData = canvas.getContext('2d').getImageData(event.offsetX, event.offsetY, 1, 1).data;
Bởi vì bạn chỉ được lấy một pixel, pixelData là một mảng Bốn entry chứa R của pixel, G, B, và các giá trị A. Đối với alpha, bất cứ điều gì nhỏ hơn 255 đại diện cho một mức độ minh bạch với 0 là hoàn toàn minh bạch.
Dưới đây là ví dụ về jsFiddle: http://jsfiddle.net/thirtydot/9SEMf/869/ Tôi đã sử dụng jQuery để thuận tiện cho tất cả điều này, nhưng không cần thiết phải sử dụng jQuery.
Lưu ý:getImageData
thác theo chính sách cùng nguồn gốc của trình duyệt để ngăn chặn rò rỉ dữ liệu, có nghĩa là kỹ thuật này sẽ thất bại nếu bạn bẩn vải với một hình ảnh từ một miền hoặc (Tôi tin, nhưng một số trình duyệt có thể giải quyết này) SVG từ bất kỳ miền nào. Điều này bảo vệ chống lại các trường hợp trang web phân phát nội dung hình ảnh tùy chỉnh cho người dùng đã đăng nhập và kẻ tấn công muốn đọc hình ảnh để nhận thông tin. Bạn có thể giải quyết vấn đề bằng cách phân phối hình ảnh từ cùng một máy chủ hoặc triển khai Cross-origin resource sharing.
bùng nổ - công việc tuyệt vời. Tôi biết tôi nên có một fiddle như thế này nhưng đã quá béo và lười biếng. bạn đã giết nó ở đây –
Để điều này đúng, bạn cần đặt không gian tọa độ của canvas tức là thiết lập chiều rộng và chiều cao cho phù hợp với kích thước hình ảnh. Chiều rộng và chiều cao CSS chỉ phân phối để kéo giãn canvas cuối cùng cho bố cục, không giúp ích gì khi đó là phần tử chưa được hiển thị. Hãy thử một cái gì đó như $ ('') ;. Hoặc thực hiện điều này bằng cách nào đó không áp dụng với canvas ngoài màn hình? – fabspro
@fabspro: Đó là một điểm tuyệt vời. Vì việc vẽ và đọc dữ liệu hình ảnh được thực hiện thông qua ngữ cảnh, các giá trị chiều rộng và chiều cao là vô nghĩa. Chúng không có bất kỳ hiệu ứng nào bị ảnh hưởng bởi vì khung không bối cảnh bị méo mó và lý do tôi không thấy hiệu ứng này trên bản demo của tôi đơn giản chỉ vì hình ảnh nhỏ hơn chiều rộng/chiều cao ban đầu của bối cảnh. Tôi sẽ cập nhật cho phù hợp, mặc dù nó là an toàn hơn để truy cập '.width' và' .height' trên vải chính nó hơn thông qua nối. –
Canvas sẽ là một cách tuyệt vời để làm điều này, như @pst đã nói ở trên. Kiểm tra câu trả lời này cho một ví dụ điển hình:
Một số mã mà sẽ phục vụ quý khách đặc biệt cũng như:
var imgd = context.getImageData(x, y, width, height);
var pix = imgd.data;
for (var i = 0, n = pix.length; i < n; i += 4) {
console.log pix[i+3]
}
này sẽ đi từng hàng, vì vậy bạn sẽ cần phải chuyển đổi đó vào một x, y và chuyển đổi vòng lặp for thành một kiểm tra trực tiếp hoặc chạy một điều kiện bên trong.
Đọc lại câu hỏi của bạn, có vẻ như bạn muốn có thể nhận được điểm mà người đó nhấp vào. Điều này có thể được thực hiện khá dễ dàng với sự kiện nhấp chuột của jquery. Chỉ cần chạy mã ở trên bên trong trình xử lý nhấp chuột như vậy:
$('el').click(function(e){
console.log(e.clientX, e.clientY)
}
Chúng nên lấy giá trị x và y của bạn.
Hai câu trả lời trước đây minh họa cách sử dụng Canvas và ImageData. Tôi muốn đề xuất một câu trả lời với ví dụ chạy được và sử dụng khung xử lý hình ảnh, vì vậy bạn không cần phải xử lý dữ liệu pixel theo cách thủ công.
MarvinJ cung cấp phương thức image.getAlphaComponent (x, y) chỉ trả về giá trị minh bạch cho pixel theo toạ độ x, y. Nếu giá trị này bằng 0, pixel hoàn toàn trong suốt, các giá trị nằm trong khoảng từ 1 đến 254 là các mức trong suốt, cuối cùng 255 sẽ mờ.
Để biểu diễn tôi đã sử dụng các hình ảnh dưới đây (300x300) với nền trong suốt và hai pixel tại tọa độ (0,0) và (150.150).
điều khiển đầu ra:
(0,0): TRANSPARENT
(150.150): NOT_TRANSPARENT
var canvas = document.getElementById("canvas");
image = new MarvinImage();
image.load("https://i.imgur.com/eLZVbQG.png", imageLoaded);
function imageLoaded(){
console.log("(0,0): "+(image.getAlphaComponent(0,0) > 0 ? "NOT_TRANSPARENT" : "TRANSPARENT"));
console.log("(150,150): "+(image.getAlphaComponent(150,150) > 0 ? "NOT_TRANSPARENT" : "TRANSPARENT"));
}
<script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>
<canvas id="canvas" width="500" height="344"></canvas>
- 1. Làm cách nào để nhận được màu của pixel tại X, Y khi sử dụng C#?
- 2. Làm thế nào để có được một thành phần của một phối hợp tikz/PGF?
- 3. Cách phối hợp y dưới cùng là
- 4. Làm thế nào tôi có thể tạo ra một mẫu giả ngẫu nhiên từ X/Y phối hợp xác định?
- 5. Làm thế nào để có được tọa độ x và y của hình ảnh bitmap trong điều khiển hình ảnh?
- 6. Tra cứu một bộ trong từ điển python phù hợp (x, y) hoặc (y, x)
- 7. Làm thế nào để có được tọa độ x, y của các đối tượng được trích xuất trong javacv?
- 8. Nhận tọa độ x, y mới của một điểm trong hình ảnh được xoay
- 9. Làm cách nào để có vị trí ô hiện tại x và y trong một DataGridView?
- 10. Bàn điều khiển Ứng dụng Chuột-Nhấn X Y Phối hợp Phát hiện/So sánh
- 11. Làm thế nào để bạn khai báo x và y sao cho x + = y đưa ra một lỗi biên dịch và x = x + y không?
- 12. Tính lạ lùng của Ruby: x == y && [x, y] .uniq == [x, y]
- 13. Làm thế nào để jQuery có thể kéo được với trục X và Y cố định?
- 14. Có cách nào thanh lịch hơn để tính x = (y/n) + (y% n? 1: 0) không?
- 15. x-y = x + ¬y + 1 vấn đề
- 16. Có trường hợp "[^ xy]" không bằng "(?! X | y)."?
- 17. Làm cách nào để xóa trục y khỏi hình ảnh được tạo bằng Pylab?
- 18. Làm cách nào để tô màu ảnh/hiển thị màu?
- 19. R: Âm mưu 4D, x, y, z, màu sắc
- 20. Làm thế nào để có được một màu đa số trong một hình ảnh?
- 21. Làm cách nào để tổng hợp một số hình ảnh NSImage thành một hình ảnh lớn?
- 22. Tìm X/Y của phần tử HTML có JavaScript
- 23. Làm cách nào để kiểm tra nhấp chuột tại một toạ độ x, y nhất định?
- 24. Làm thế nào để chuyển đổi pixel nguyên be.rgb (x, y) thành Màu (r, g, b, a) trong Java?
- 25. Làm thế nào để có được vĩ độ và lâu dài cho một điểm ảnh của một hình ảnh eumetsat bằng cách sử dụng python?
- 26. Lấy tọa độ X & Y của một nút trong Android?
- 27. Trang X của Y trong LaTeX Footer
- 28. Làm thế nào để có được một hình ảnh màu sắc trong iPhone sdk
- 29. x, y = getPos() so với (x, y) = getPos()
- 30. Bày tỏ rằng một tập hợp con cụ thể của X có tính chất Y trong core.logic
thể hình ảnh bằng cách nào đó được nạp trên một phần tử Canvas? –
Nếu không có cách nào khác, thì –
Đó là cách nó phải được thực hiện. –