2014-05-23 17 views
14

Có ai có giải pháp tốt để thay đổi màu sắc của một vùng không trong suốt, với sự trợ giúp của HTML5 hoặc Canvas (hay bất kỳ công nghệ HTML5 nào khác).Chuyển đổi màu ảnh mà không thay đổi nền trong suốt

Tôi googled rất nhiều và tìm thấy một số giải pháp (với Canvas) mà có thể thay đổi màu sắc của một hình ảnh, giống như,

How do i tint an image with HTML5 Canvas?

Canvas - Change colors of an image using HTML5/CSS/JS?

Nhưng những giải pháp cũng thay đổi nền trong suốt đối với màu đã cho (mà tôi không muốn).

Stackoverflow image with transparent pixel(background)

Its a stackoverflow png với nền trong suốt. Bây giờ, tôi muốn thay đổi màu sắc hình ảnh mà không ảnh hưởng đến các pixel trong suốt (nền) của nó, để tôi có thể lưu lại hình ảnh với sự trợ giúp của phương pháp canvas toDataURL với màu mới.

Tôi không chắc chắn liệu có thể với HTML5 hay không. Bất kỳ sự trợ giúp nào cũng được đánh giá cao.

Cảm ơn trước.

******************* EDITED *********************

gia tăng hình ảnh mới của viên thuốc (viên nang).

enter image description here

+0

Đây có thể là chính xác những gì bạn đang không tìm kiếm, nhưng những gì tôi thường làm gì để thay đổi màu sắc hình ảnh chỉ là làm cho nó một chút minh bạch, và thiết lập các màu sắc hình ảnh nền cho màu sắc mong muốn. – dcclassics

+0

@dcclassics: Tôi nghĩ bạn hiểu sai tôi. Tôi có một hình ảnh png với một số điểm ảnh trong suốt, ví dụ, một hình ảnh png (nhân vật hoạt hình) png. Vì mario là một nhân vật và có mặt đa thức. Hình ảnh của chúng tôi phải chứa một số pixel trong suốt. Vì vậy, bây giờ, tôi muốn thay đổi màu sắc của một nhân vật (Mario) mà không thay đổi các điểm ảnh trong suốt. –

+0

Bạn có thể muốn 'canvas.getImageData' và' putImageData', cho phép bạn chỉnh sửa một canvas pixel-by-pixel, sử dụng giá trị RGBA. Xem [hướng dẫn này] (http://beej.us/blog/data/html5s-canvas-2-pixel/) để bắt đầu. – apsillers

Trả lời

26

Một Demo (xem ghi chú về bản demo này dưới đây): http://jsfiddle.net/m1erickson/2d7ZN/

enter image description here

Bạn có thể lấy một mảng chứa dữ liệu RGBA pixel của hình ảnh sử dụng context.getImageData

var imageData=context.getImageData(0,0,canvas.width,canvas.height); 

var data=imageData.data; 

Từ đó bạn có thể đọc (và tùy ý thay đổi) màu của mỗi pixel.

Mảng rgba được đặt ra như thế này:

// top-left pixel (x:0,y:0) 

data[0] red of pixel#0 (0-255) 
data[1] green of pixel#0 (0-255) 
data[2] blue of pixel#0 (0-255) 
data[3] alpha of pixel#0 (opacity: 0-255) 

// next pixel (x:1,y:0) 

data[4] red of pixel#1 
data[5] green of pixel#1 
data[6] blue of pixel#1 
data[7] alpha of pixel#1 

Bạn có thể thay đổi R, G, B hoặc A thành phần của bất kỳ điểm ảnh bằng cách thay đổi các mảng dữ liệu

Ví dụ, điều này thay đổi pixel trái trên xuống rắn đỏ

data[0]=255; // red 
data[1]=0;  // green 
data[2]=0;  // blue 
data[3]=255; // alpha (opacity) 

Về tính minh bạch:

Thành phần alpha của mỗi pixel xác định độ trong suốt của pixel.Nếu bạn chỉ muốn thay đổi pixel chủ yếu là đục sau đó bạn có thể dễ dàng bỏ qua tất cả các điểm ảnh bán trong suốt như thế này:

// alpha is 0-255 
// ignore pixels with alpha < 200 (ignore all pixels that are mostly semi-transparent) 

if(data[3]<200) { // don't process this pixel } 

Cuối cùng, bạn có thể đẩy pixel bị thay đổi của bạn trở lại vào khung với .putImageData

context.putImageData(imageData,0,0); 

Lưu ý về Demo

Thật khó để "Recolor" một hình ảnh sử dụng tông màu RGBA mặc định của canvas.

Vì vậy, bản demo này chuyển đổi dữ liệu RGB để chương trình HSL màu. Điều này cho phép "color" (màu sắc) phải được thay đổi mà không ảnh hưởng đến các thành phần khác của pixel (S = bão hòa của màu sắc, L = nhẹ nhàng của màu sắc).

Sau pixel được recolored, mà sửa đổi dữ liệu HSL được chuyển đổi trở lại RGBA và lưu vào mảng dữ liệu.

+1

Cảm ơn markE. Đó là một giải pháp khá tốt. Mặc dù, tôi vẫn đang đấu tranh với vấn đề này. Tôi không biết màu mà tôi muốn thay đổi trong hình ảnh. Tôi chỉ muốn thêm một màu được người dùng chuyển đến hình ảnh (đó là một hỗn hợp của màu sắc hình ảnh gốc + màu được người dùng truyền qua). –

+0

Tôi đã thêm một hình ảnh mới của viên thuốc (viên nang). Tôi muốn thay đổi màu sắc của nó được chuyển bởi người dùng dưới dạng thập lục phân. Mọi hướng dẫn về điều đó sẽ thật tuyệt vời. Cảm ơn trong Adv. –

+0

Vâng, điểm ảnh trong suốt có giá trị alpha gần bằng không (có thể 0-10) do đó, không thay đổi pixel với giá trị alpha thấp. Hình ảnh viên thuốc của bạn có màu sáng hơn và tối hơn. Nếu bạn muốn thay đổi phần tối hơn của thuốc sau đó nhắm mục tiêu pixel với giá trị rgb thấp hơn (giá trị rgb thấp hơn == màu tối hơn). Nếu bạn muốn thay đổi phần nhẹ hơn của thuốc sau đó nhắm mục tiêu pixel với giá trị rgb cao hơn. Như trong câu trả lời của tôi, bạn nên chuyển đổi các pixel đã chọn thành HSL và thay đổi màu của các pixel đã chọn về màu được người dùng truyền. Bằng cách đó, độ bão hòa và độ sáng của hình ảnh vẫn còn. – markE

Các vấn đề liên quan