Преобразование растрового изображения - создание прозрачного + черного изображения из черно-белого источника - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть целая куча jpg файлов, которые мне нужно использовать в проекте, которые по тем или иным причинам не могут быть изменены. Каждый файл похож (почерк), черная ручка на белом BG. Однако мне нужно использовать эти активы на фоне не белого цвета в моем проекте Flash, поэтому я пытаюсь выполнить некоторую обработку на стороне клиента, чтобы избавиться от фонов, используя getPixel и setPixel32.

Код, который я сейчас использую, использует линейное сравнение, и хотя он работает, результаты меньше ожидаемых, так как оттенки серого теряются в миксе. Помимо того, что я просто настраиваю свои параметры, чтобы все выглядело правильно, у меня возникает ощущение, что мой метод вычисления значения RGBa слабый.

Кто-нибудь может порекомендовать лучшее решение, чем то, что я использую ниже? Очень ценится!

private function transparify(data:BitmapData) : Bitmap {

    // Create a new BitmapData with transparency to return
    var newData:BitmapData = new BitmapData(data.width, data.height, true);
    var orig_color:uint;
    var alpha:Number;
    var percent:Number;

    // Iterate through each pixel using nested for loop
    for(var x:int = 0; x < data.width; x++){
        for (var y:int = 0; y < data.height; y++){

            orig_color = data.getPixel(x,y);

            // percent is the opacity percentage, white should be 0, 
            // black would be 1, greys somewhere in the middle
            percent = (0xFFFFFF - orig_color)/0xFFFFFF;

            // To get the alpha value, I multiply 256 possible values by 
            // my percentage, which gets multiplied by 0xFFFFFF to fit in the right
            // value for the alpha channel
            alpha = Math.round(( percent )*256)*0xFFFFFF;

// Adding the alpha value to the original color should give me the same 
// color with an alpha channel added
            var newCol = orig_color+alpha;
            newData.setPixel32(x,y,newCol);
        }
    }

    var newImg:Bitmap = new Bitmap(newData);
    return newImg;
} 

1 Ответ

0 голосов
/ 12 ноября 2010

Поскольку это белый фон, blendMode может дать вам лучший результат.

...