1

嗨,我正在借助 html 和 javascript 开发一个 Windows 8 应用程序。我必须显示从 api 接收到的一些 png 图像,并且必须将它们的颜色设置为从 api 接收到的颜色。我用谷歌搜索了很多,但没有找到解决方案。虽然我知道在 xaml 中可以这样做

<Rectangle Fill="{Binding Path=widget.logo, Converter={StaticResource PSWidgetLogoColorConverter1}}" Height="60" Width="60">
                                        <Rectangle.OpacityMask>
                                            <ImageBrush ImageSource="{Binding Path=widget.logo,Converter={StaticResource PSWidgetImageConverter1}}"/>
                                        </Rectangle.OpacityMask>
                                    </Rectangle>

但无法弄清楚如何在这里做到这一点。

欢迎您提出宝贵的建议,请帮助。

4

1 回答 1

0

我认为您必须更改canvas元素内的颜色。

  1. 将 canvas 标签添加到您的应用程序中:

     <canvas id="myCanvas" />
    
  2. 在画布内加载图像:

    var myImage = new Image();
    canvas = document.getElementById("myCanvas");
    
    if (canvas.getContext) {
      ctx = canvas.getContext("2d");
      myImage.onload = function() {
        ctx.drawImage(myImage, 0, 0);
      }
      myImage.src = "kestral.png";
    }
    
  3. 获取图像数据并根据您的需要进行更改:

getImageData返回画布内 x,y,width 和 height 处的所有 rgba 值。所以它是:getImageData(x,y,width,height)。结果,您得到一个大小为: width*height*4 的数组,然后您可以遍历它并更改每种 rgba 颜色:

    myImage = ctx.getImageData(0, 0, 200, 200);
    var picLength = 200*200;

    // Loop through data.
    for (var i = 0; i < picLength * 4; i += 4) {
      // First bytes are red bytes.        
      // Second bytes are green bytes.
      // Third bytes are blue bytes.
      // Fourth bytes are alpha bytes
      //check for full alpha
      if(myImage.data[i+3] == 255) {
         //change it to black
         myImage.data[i]=0;
         myImage.data[i+1]=0;
         myImage.data[i+2]=0;
         myImage.data[i+3]=0;
      }
    }
  1. 把改变的图像数据放回去

    ctx.putImageData(myImage, 0, 0);
    

是关于 msdn 的一个很好且完整的示例。

于 2013-09-01T18:53:06.820 回答