2011-01-13 6 views
2

私は白い背景に黒のテキストだけを持つ.pngの束を持っています。今までこれらはすべて画面上の白い背景に表示されていたので問題はありませんでした。しかし、今、私は背景の着色を変更しています。問題は、オフホワイトの背景に対して設定したときにテキストが少し外に見えることです。JavaScript(jQueryは問題ありません)が.pngの白い背景を透明な背景に変換できるかどうかを知ることに興味があります。私はではありません。は、この問題のサーバー側の解決に関心がありません(たとえば、すべての画像を実行し、画像ライブラリを使ってプログラムで実行するスクリプト)。そして、画像のせん断数は、実用的ではない。JavaScriptを使用してPNGの白い背景を透明な背景に変換する方法はありますか?

これを行う方法を知っている人はいますか?検索は何も明らかにしなかった。私はではなく、で、IE .png修正を探しています。

方法がある場合、そのようなプロセスに関連するオーバーヘッドは何ですか?

ありがとうございました!

+0

ブラウザ固有の機能を使用している可能性がありますが、その価値はありません。バッチで変換を行うアプリケーションを見つけるだけです。 ImageMagickのコマンドラインユーティリティはおそらくあなたを動かすための何かを持っています。 –

+0

ブライアンに感謝します。私はそれがおそらくそれになるだろうと思うが、私は最初に私のオプションを探求したい。 –

答えて

6

私が考えることができる最も近い点は、IE固有のものです。あなたが望むことを行うことができるかもしれないクロマフィルタがあります青は透明になります、あなたのケースでは、何か白が透明になります)。参照:http://www.ssi-developer.net/css/visual-filters.shtml。他のブラウザやCSS3ではこれと同等のものは見つかりません。

ドキュメント内のすべてのイメージを検索し、キャンバス要素に置き換え、イメージをキャンバスにペイントし、ピクセル単位でイメージデータを通過させ、ピクセルが特定の色は、アルファを0(透明)に変更します。

このコンセプトのクイックPOCがあります。 Chrome & FFで動作するようにするには、ウェブサーバーでこれを実行する必要があります。IE9ベータ版でローカルに実行できます。

純粋な白色のRGB(255,255,255)を使用してイメージを変更するだけです。アルファチャンネルを0に設定すると、画像内の白いピクセルが透明になります。

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Test</title> 
    <style type="text/css"> 
     body { background-color: #00f; margin: 0px; padding: 0px; } 
    </style> 
    <script type="text/javascript" src="jquery-1.4.4.min.js"></script> 
    </head> 
    <body> 
    <img src="test.png"> 
    <img src="test.png"> 
    </body> 
    <script type="text/javascript"> 
    $(function() { 
     $("img").each(function() { 
     var $this = $(this); 
     var tim = $this.get(0); 
     var idx = $this.index(); 

     var canvas = null; 
     var ctx = null; 

     var img = new Image(); 
     img.onload = function() { 
      copyImageToCanvas(img); 
     }; 
     img.setAttribute("src", tim.src); 

     function copyImageToCanvas(aImg) { 
      canvas = document.createElement("canvas"); 

      var w = typeof aImg.naturalWidth == "undefined" ? aImg.width : aImg.naturalWidth; 
      var h = typeof aImg.naturalHeight == "undefined" ? aImg.height : aImg.naturalHeight; 

      canvas.id = "img" + idx; 
      canvas.width = w; 
      canvas.height = h; 

      $this.replaceWith(canvas); 

      ctx = canvas.getContext("2d"); 
      ctx.clearRect(0, 0, w, h);  
      ctx.drawImage(aImg, 0, 0); 

      makeTransparent(aImg); 
     } 

     function makeTransparent(aImg) { 

      var w = typeof aImg.naturalWidth == "undefined" ? aImg.width : aImg.naturalWidth; 
      var h = typeof aImg.naturalHeight == "undefined" ? aImg.height : aImg.naturalHeight; 
      var imageData = ctx.getImageData(0, 0, w, h); 

      for (var x = 0; x < imageData.width; x++) 
      for (var y = 0; y < imageData.height; y++) { 
       var offset = (y * imageData.width + x) * 4; 
       var r = imageData.data[offset]; 
       var g = imageData.data[offset + 1]; 
       var b = imageData.data[offset + 2]; 

       //if it is pure white, change its alpha to 0    
       if (r == 255 && g == 255 && b == 255) 
       imageData.data[offset + 3] = 0; 
      }; 

      ctx.putImageData(imageData, 0, 0); 
     } 
     }); 
    }); 
    </script> 
</html> 
+0

答えジミーのおかげで!それは私の問題を解決しませんでしたが(現在の定義ではおそらく解決できません)、あなたの答えは非常に役に立ちました。 –

+0

私はまずjsfiddleで試しましたが、クロスドメインの問題はテストするのが難しいです。私のサーバーでは、私はこのコードが私のために働くことを確認しました。これは私のために働く。ありがとうございました。 – Kabkee

0

私がjs画像処理用に知っている唯一のオプションはPixasticであり、必要な機能がありません。 あなたは私が知っている限りそれをサーバー側で行う必要があります

+0

そして、もしあなたがそれをサーバー側で行うならば、AJAXだけで新しいイメージを返すことができるので、完全なポストバックが返ってくることはありません。 –

関連する問題