Руководство по actionscript. часть 5, стр. 026
Хотя непосредственно изменить значение отдельного канала в существующем 32-битном значении цвета невозможно, мы можем достичь этого эффекта, используя комбинацию бинарных операций. Сначала мы очищаем байт нужного канала в существующем значении цвета; затем мы объединяем получившееся число с новым значением цветового канала. Эта методика продемонстрирована в следующем коде. При его выполнении создается число, которое является результатом вставки шестнадцатеричного значения АА в существующее значение цвета:
var colorValue:uint = 0xFFFFCC99; // Выбранный цвет
// Очищаем байт канала Red в исходном значении цвета и присваиваем результат // обратно переменной colorValue colorValue &= OxFFOOFFFF;
// Объединяем значение переменной colorValue с новым значением канала Red colorValue |= (0хАА«16);
trace(colorValue. toString(16)); // Выводит: ffaacc99 Внимательно посмотрите на последнюю строку кода: trace(colorValue. toString(16)); // Выводит: ffaacc99
Этот код генерирует строку в шестнадцатеричном формате для числового значения цвета, вызывая над этим значением метод toString( ) и передавая в качестве
параметра radix значение 16. Строка в шестнадцатеричном формате проще для чтения, чем ее числовой десятичный эквивалент. Тем не менее в качестве средства обеспечения удобочитаемости значения цвета метод toString( ) неидеален — он опускает ведущие нули. Например, для числа
var n:uint = 0х0000СС99;
выражение п. toString (16) вернет значение сс9 9, опустив четыре ведущих нуля. Чтобы улучшить удобочитаемость значений цветов на этапе отладки, мы можем написать собственный код, наподобие представленного в листинге 26.1. В этом листинге представлен класс Pixel, предназначенный для работы со значениями цветов. Класс Pixel помещает бинарные операции в удобные методы, например setRed ( ) и set Alpha ( ). Методы этого класса могут получать и устанавливать уровни отдельных цветовых каналов в значении цвета и генерировать строки, описывающие значения цвета с использованием различных удобочитаемых форматов. Описание класса Pixel доступно в Интернете по адресу http://www. moock. org/eas3/examples.
Листинг 26.1. Класс Pixel
package { public class Pixel { private var value:uint; // Значение цвета пиксела
public function Pixel (nl:uint, n2:int=0, n3:int=0, n4:int=0) { if (arguments. length == 1) {
value = nl; } else {
value = nl«24 | n2«16 | n3«8 | n4;
}
}
public function setAlpha (n:int):void { if (n < о 11 n > 255) { throw new RangeError(«Supplied value must be in the range 0-255.»);
}
value &= (OxOOFFFFFF); value |= (n«24);
}
public function setRed (n;int):void { if (n < 0 11 n > 255) { throw new RangeError(«Supplied value must be in the range 0-255.»);
}
value &= (OxFFOOFFFF); value |= (n«16);
}
public function setGreen (n:int):void { if (n < 0 11 n > 255) { throw new RangeError(«Supplied value must be in the range 0-255.»);
value &= (OxFFFFOOFF); value |= (n«8);
}
public function setBlue (n:int):void { if (n < 0 11 n > 255) { throw new RangeErrorC Supplied value must be in the range 0-255.»);
}
value &= (OxFFFFFFOO); value |= (n);
}
public function getAlpha ( ):int { return (value » 24) & OxFF;
}
public function getRed ( ):int { return (value » 16) & OxFF;
}
public function getGreen ( ):int { return (value » 8) & OxFF;
}
public function getBlue ( );int { return value & OxFF;
}
public function toString ( ):String { return toStringARGB( );
}
public function toStringARGB (radix:int = 16):String { var s:String =
«A:» + ((value » 24)&0xFF).toString(radix).toUpperCase( ) + » R:» + ((value » 16)&0xFF).toString(radix).toUpperCase( ) + » G:» + ((value » 8)&0xFF).toString(radix).toUpperCase( ) + » B:» + (value&OxFF).toString(radix).toUpperCase( ); return s;
}
public function toStringAlpha (radix:int = 16):String { return ((value » 24)&0xFF).toString(radix).toUpperCase( );
}
public function toStringRed (radix:int = 16):String { return ((value » 16)&0xFF).toString(radix).toUpperCase( );
}
public function toStringGreen (radix:int = 16):String { return ((value » 8)&0xFF).toString(radix).toUpperCase( );
public function toStnngBlue (radix:int = 16):String return (value&OxFF) .toStnng(radix) .toUpperCase( );
}
}
// Примеры использования:
var p:Pixel = new Pixel(0xFFFFCC99);
p. setRed(OxAA):
trace(p); // Выводит:
trace(p. getRed( )); // Выводит:
trace(p. toStringRed( )); // Выводит:
// Выбранный цвет
A:FF R:AA G:CC В:99
170
AA
var p2:Pixel = new Pixel(0×33,0×66,0×99,OxCC); trace(p2.toStringARGB(10)): // Выводит: A:51 R:102 G:153 B:204
Создание нового растрового изображения
Для создания и отображения совершенно нового растрового изображения нужно выполнить такую последовательность действий.