2013-04-26 56 views
7

Tôi đang cố tạo trò chơi bằng canvas của HTML5. Tôi có một số sprites, tôi có thể tải chúng tốt, và chúng hoạt động tốt, nhưng một số phần của hình ảnh cụ thể là #ff0000 và tôi muốn có thể thay thế bằng một số màu khác, một màu được người dùng tùy chỉnh xác định.Thay thế một màu cụ thể bằng một hình ảnh/hình ảnh khác

Tôi không thực sự dẫn đầu về điều này, tôi đã thấy bộ lọc hình ảnh đã thấy, nhưng tôi không thực sự tìm thấy bất kỳ ví dụ nào phù hợp với việc sử dụng của tôi và không có bộ não tự nghĩ về nó , tin tôi đi, tôi đã thử.

Bất kỳ trợ giúp, khách hàng tiềm năng hoặc bất kỳ điều gì sẽ được đánh giá cao.

+0

Bạn đang tìm kiếm để trực tiếp thay đổi pixel riêng lẻ trong các phần cụ thể của một hình ảnh hoặc một cái gì đó rộng hơn mà chỉ áp dụng đối với hình ảnh đầy đủ? – newfurniturey

+0

Cái gì đó 'quét' toàn bộ hình ảnh cho một màu nhất định và thay thế nó. –

Trả lời

8

Bạn có thể sử dụng globalCompositeOperation = "source-in"

Ví dụ, sau đây vẽ bức hình thành một (mới) canvas, và thiết lập màu sắc.

ctx.save(); 

    // Draw mask to buffer 
    ctx.clearRect(0, 0, this.width, this.height); 
    ctx.drawImage(your_image, 0, 0, this.width, this.height, 0, 0, this.width, this.height); 

    // Draw the color only where the mask exists (using source-in) 
    ctx.fillStyle = [your color]; // 
    ctx.globalCompositeOperation = "source-in"; 
    ctx.fillRect(0, 0, this.width, this.height); 

    ctx.restore(); 

Tôi sử dụng kỹ thuật chính xác này để đặt màu văn bản cho phông chữ bitmap của tôi.

+0

OP muốn thay thế 1 màu trên hình ảnh nhiều màu để chúng cũng cần bạn chỉ cho họ cách tạo mặt nạ màu để sử dụng với nguồn của bạn. :) – markE

+0

@markE Tôi chỉ đang chỉ cho bạn đúng hướng. Đó là công việc của bạn bây giờ;) – Jarrod

+0

Chuckle - ok nhưng nó sau nửa đêm ở đây một tôi đang buồn ngủ vì vậy tôi sẽ hiển thị getImageData thay thế. Tôi ** làm như ** ý tưởng của bạn về tổng hợp một màu mặt nạ trong sản xuất - có vẻ sạch hơn bằng cách nào đó. G'nite, bạn đời! – markE

9

Bạn có thể sử dụng canvas 'getImageData để thay thế bất kỳ màu nào bằng bất kỳ màu nào khác.

// pull the entire image into an array of pixel data 
var imageData = context.getImageData(0, 0, w, h); 

// examine every pixel, 
// change any old rgb to the new-rgb 
for (var i=0;i<imageData.data.length;i+=4) 
    { 
     // is this pixel the old rgb? 
     if(imageData.data[i]==oldRed && 
     imageData.data[i+1]==oldGreen && 
     imageData.data[i+2]==oldBlue 
    ){ 
      // change to your new rgb 
      imageData.data[i]=newRed; 
      imageData.data[i+1]=newGreen; 
      imageData.data[i+2]=newBlue; 
     } 
    } 
// put the altered data back on the canvas 
context.putImageData(imageData,0,0); 

Đây là mã và một Fiddle: http://jsfiddle.net/m1erickson/4apAS/

<!doctype html> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css --> 
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script> 

<style> 
    body{ background-color: ivory; padding:20px; } 
    img{border:1px solid red;} 
</style> 

<script> 
$(function(){ 


    // this just makes an image we can test with 
    // it's just an image of a red rectangle 
    var temp=document.createElement("canvas"); 
    var tempctx=temp.getContext("2d"); 
    tempctx.fillStyle="red"; 
    tempctx.strokeStyle="blue"; 
    tempctx.lineWidth=5; 
    tempctx.rect(20,20,75,50); 
    tempctx.fill(); 
    var image0=document.getElementById("image0"); 
    image0.src=temp.toDataURL(); 

    var image=new Image(); 
    image.onload=function(){ 
     // call function to replace red with green 
     recolorImage(image,255,0,0,0,255,0); 
    } 
    image.src= image0.src; 


    function recolorImage(img,oldRed,oldGreen,oldBlue,newRed,newGreen,newBlue){ 

     var c = document.createElement('canvas'); 
     var ctx=c.getContext("2d"); 
     var w = img.width; 
     var h = img.height; 

     c.width = w; 
     c.height = h; 

     // draw the image on the temporary canvas 
     ctx.drawImage(img, 0, 0, w, h); 

     // pull the entire image into an array of pixel data 
     var imageData = ctx.getImageData(0, 0, w, h); 

     // examine every pixel, 
     // change any old rgb to the new-rgb 
     for (var i=0;i<imageData.data.length;i+=4) 
      { 
       // is this pixel the old rgb? 
       if(imageData.data[i]==oldRed && 
       imageData.data[i+1]==oldGreen && 
       imageData.data[i+2]==oldBlue 
      ){ 
        // change to your new rgb 
        imageData.data[i]=newRed; 
        imageData.data[i+1]=newGreen; 
        imageData.data[i+2]=newBlue; 
       } 
      } 
     // put the altered data back on the canvas 
     ctx.putImageData(imageData,0,0); 
     // put the re-colored image back on the image 
     var img1=document.getElementById("image1"); 
     img1.src = c.toDataURL('image/png'); 

    } 

}); // end $(function(){}); 
</script> 

</head> 

<body> 
    <p>Original Image</p> 
    <img id="image0" width=200 height=200><br/> 
    <p>Red recolored Green Image</p> 
    <img id="image1" width=200 height=200> 
</body> 
</html> 
+0

Tôi gặp sự cố với vấn đề này. Nó thay thế hầu hết các màu sắc nhưng không phải tất cả chúng. Tôi đang thu hẹp lại bức tranh trước khi thay đổi màu sắc nếu điều này có bất kỳ kết quả nào. Bất kỳ ý tưởng? –

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