Тарифы Услуги Сим-карты

Могущественный альфа-канал. Альфа каналы в фотошопе

Этот метод часто применяется для многопроходной обработки изображения по частям с последующей комбинацией этих частей в единое двумерное результирующее изображение. Таким образом, альфа канал представляет собой пустое пространство, или просто прозрачность.

Термин альфа-канал впервые введён в оборот Алви Смитом в конце 1970-х и детально проработан в статье Томаса Портера и Тома Даффа 1984 года .

Поддержка альфа-канала в формате .ico

Windows XP поддерживает 32-битные значки (иконки) - 24-бита цвета RGB и 8-битный альфа канал. Это позволяет отображать значки со сглаженными (размытыми) краями и тенью, которые сочетаются с любым фоном.

Альфа-канал в CSS3 и SVG

Альфа-канал в Canvas

Применение альфа-канала также возможно в Canvas. Например для полупрозрачности фигур или изображений.

Примечания


Wikimedia Foundation . 2010 .

Смотреть что такое "Альфа-канал" в других словарях:

    Сущ., кол во синонимов: 1 канал (68) Словарь синонимов ASIS. В.Н. Тришин. 2013 … Словарь синонимов

Растровое изображение образуется из целого количества строк и столбцов. Для любого экземпляра класса, производного от BitmapSource, эти размеры могут быть получены из свойств PixelHeight и PixelWidth .

На концептуальном уровне биты пикселов хранятся в двумерном массиве, размеры которого равны PixelHeight и PixelWidth. Фактически массив имеет всего одно измерение, но основные проблемы возникают с представлением отдельных пикселов. В этом представлении, иногда называемым «цветовым форматом» растрового изображения, может использоваться от одного бита на пиксел (для изображений, состоящих только из черного и белого цветов) до одного байта на пиксел (для изображений, состоящих из оттенков серого или растров с 256-цветовой палитрой), 3 или 4 байтов на пиксел (для полноцветных изображений с прозрачностью или без нее) и даже более для больших цветовых разрешений.

Однако для работы с WriteableBitmap был установлен единый цветовой формат. В любом объекте WriteableBitmap каждый пиксел состоит из четырех байтов. Таким образом, общее количество байтов в массиве пикселов растрового изображения равно:

PixelHeight * PixelWidth * 4

Изображение начинается с верхней строки и следует слева направо. Выравнивание строк отсутствует. Для каждого пиксела байты следуют в определенном порядке:

Синий, Зеленый, Красный, Альфа

Значения байтов лежат в диапазоне от 0 до 255, как в значениях Color. Предполагается, что цветовые значения WriteableBitmap соответствуют схеме sRGB («стандарт RGB»), а следовательно, совместимы со значениями Windows Runtime Color (кроме значения Colors.Transparent - см. далее).

Пикселы WriteableBitmap хранятся в предумноженном альфа-канале (premultiplied alpha) . Вскоре я расскажу, что это значит.

Порядок «синий-зеленый-красный-альфа» на первый взгляд противоположен тому, который обычно используется для обозначения цветовых байтов (и их порядку в методе Color.FromArgb), но он вполне логичен, если учесть, что пиксел WriteableBitmap в действительности представляет собой 32-разрядное целое без знака, у которого в старшем байте хранится альфа-канал, а в младшем - синяя составляющая. В операционных системах на базе микропроцессоров Intel это целое число хранится в прямом (little-endian) порядке байтов.

Давайте построим растровое изображение. Для этого мы создадим объект WriteableBitmap и заполним его пикселами. Чтобы упростить вычисления, WriteableBitmap будет состоять из 256 строк и 256 столбцов. Левый верхний угол будет черным, правый верхний - синим, левый нижний - красным, и правый нижний - фиолетовый (сочетание красного и синего). Окраска представляет собой разновидность градиента, но она отличается от градиентов, доступных в Windows Runtime.

Файл XAML определяет элемент Image, которому присваивается экземпляр класса производного от ImageSource:

Создать экземпляр WriteableBitmap в XAML невозможно, потому что у этого класса нет конструктора без параметров. Файл фонового кода создает и строит WriteableBitmap в обработчике события Loaded. Ниже приведен полный файл вместе с необходимыми директивами using. Сам класс WriteableBitmap определяется в пространстве имен Windows.UI.Xaml.Media.Imaging:

Using System.IO; using Windows.UI.Xaml; using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Controls; using System.Runtime.InteropServices.WindowsRuntime; namespace WinRTTestApp { public sealed partial class MainPage: Page { public MainPage() { this.InitializeComponent(); Loaded += MainPage_Loaded; } private async void MainPage_Loaded(object sender, RoutedEventArgs e) { WriteableBitmap bitmap = new WriteableBitmap(256, 256); byte pixels = new byte; for (int y = 0; y < bitmap.PixelHeight; y++) for (int x = 0; x < bitmap.PixelWidth; x++) { int index = 4 * (y * bitmap.PixelWidth + x); pixels = (byte)x; // Blue pixels = 0; // Green pixels = (byte)y; // Red pixels = 255; // Alpha } using (Stream pixelStream = bitmap.PixelBuffer.AsStream()) { await pixelStream.WriteAsync(pixels, 0, pixels.Length); } bitmap.Invalidate(); image.Source = bitmap; } } }

Конструктору WriteableBitmap должна передаваться ширина и высота изображения в пикселах. На основании этих размеров программа выделяет память для массива байтов:

Byte pixels = new byte;

Размер массива для WriteableBitmap всегда вычисляется по этой формуле.

Циклы по строкам и столбцам перебирают все пикселы изображения. Индекс для обращения к конкретному пикселу в массиве вычисляется следующим образом:

Int index = 4 * (y * bitmap.PixelWidth + x);

В этом конкретном примере два цикла обращаются к пикселам в порядке их хранения в массиве, так что индекс не приходится пересчитывать заново для каждого пиксела. Его можно инициализировать нулем, а потом увеличивать следующим образом:

Int index = 0; for (int y = 0; y < bitmap.PixelHeight; y++) for (int x = 0; x < bitmap.PixelWidth; x++) { int index = 4 * (y * bitmap.PixelWidth + x); pixels = (byte)x; // Blue pixels = 0; // Green pixels = (byte)y; // Red pixels = 255; // Alpha }

Такое решение почти наверняка будет работать быстрее моего, но в целом оно обладает меньшей гибкостью.

Также можно определить цикл по index с вычислением x и y по текущему значению переменной. Важна не конкретная реализация, а то, чтобы в результате перебора были обработаны все пикселы (не всегда, конечно, но в большинстве случаев).

После того, как массив byte будет заполнен, пикселы необходимо перенести в объект WriteableBitmap. Этот процесс на первый взгляд выглядит довольно странно. Свойство PixelBuffer, определяемое WriteableBitmap, относится к типу IBuffer , который определяет всего два свойства: Capacity и Length. Как было указано ранее, объект IBuffer обычно представляет область памяти, находящуюся под управлением операционной системы с механизмом подсчета ссылок; когда память становится ненужной, объект автоматически уничтожается. Байты необходимо перенести в такой буфер.

К счастью, существует метод расширения AsStream , позволяющий интерпретировать объект IBuffer как объект.NET Stream:

Stream pixelStream = bitmap.PixelBuffer.AsStream()

Чтобы использовать этот метод расширения, необходимо включить в программу директиву using для пространства имен System.Runtime.InteropServices.WindowsRuntime. Без этой директивы InlelliSense не будет знать о существовании этого метода.

Далее обычный метод Write, определяемый классом Stream, используется для записи байтового массива в объект Stream; также можно использовать метод WriteAsync, как сделано у меня. Так как изображение невелико, а вызов просто передает массив байтов через API, метод Write отработает достаточно быстро для выполнения операции в потоке пользовательского интерфейса. Далее объект Stream уничтожается «вручную» или автоматически, или же логика Stream размешается в директиве using, как это сделано у меня:

Using (Stream pixelStream = bitmap.PixelBuffer.AsStream()) { await pixelStream.WriteAsync(pixels, 0, pixels.Length); }

Привыкните к тому, что при каждом изменении пикселов WriteableBitmap следует вызывать для изображения Invalidate:

Bitmap.Invalidate();

Этот вызов требует перерисовки растрового изображения. В этом конкретном контексте его присутствие не обязательно, но в других случаях он важен. Остается вывести построенное изображение. Программа просто задает его свойству Source элемента Image в файле XAML:

Image.Source = bitmap;

Результат:

Если сохранить объект Stream и массив пикселов в поле для дальнейших манипуляций с растровым изображением (например, его изменения со временем), перед вызовом WriteAsync следует вставить вызов Seek для возвращения текущей позиции к началу:

PixelStream.Seek(0, SeekOrigin.Begin);

Учтите, что в объект растрового изображения можно записать только часть массива байтов. Предположим, вы изменили пикселы в диапазоне от (x1, y1) до (x2, y2) (не включая последнюю точку). Сначала определите индексы байтов, соответствующих этим двум координатам:

Int index1 = 4 * (y1 * bitmap.PixelWidth + x1); int index2 = 4 * (y2 * bitmap.PixelWidth + x2);

Затем укажите, что вы собираетесь обновить пикселы от index1 до index2:

PixelStream.Seek(index, SeekOrigin.Begin); pixelStream.Write(pixels, index1, index2 - index1); bitmap.Invalidate();

Попробуем реализовать другую разновидность пользовательского градиента. В следующей программе CircularGradient градиент вычисляется на основании угла конкретного пиксела относительно центра изображения (вычисления проще, чем можно ожидать).

Файл XAML определяет Ellipse с толстым контуром и объектом ImageBrush для свойства Stroke. Анимация поворачивает объект Ellipse относительно центра:

Обработчик Loaded в файле фонового кода почти не отличается от предыдущей программы. Два цикла перебирают строки и столбцы изображения, каждый пиксел расположен в позиции (x,y) относительно левого верхнего угла. Пиксел в центре имеет координаты (bitmap.PixelWidth/2, bitmap.PixelHeight/2). В результате вычитания координат центра из координат конкретного пиксела и деления на ширину и высоту изображения координаты пиксела преобразуются в значения из диапазона от -1/2 до 1/2, которые затем можно передать методу Math.Atan2 дли получения нужного угла:

Using System.IO; using Windows.UI.Xaml; using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Controls; using System.Runtime.InteropServices.WindowsRuntime; using System; namespace WinRTTestApp { public sealed partial class MainPage: Page { public MainPage() { this.InitializeComponent(); Loaded += MainPage_Loaded; } private async void MainPage_Loaded(object sender, RoutedEventArgs e) { WriteableBitmap bitmap = new WriteableBitmap(256, 256); byte pixels = new byte; int index = 0; int centerX = bitmap.PixelWidth / 2; int centerY = bitmap.PixelHeight / 2; for (int y = 0; y < bitmap.PixelHeight; y++) for (int x = 0; x < bitmap.PixelWidth; x++) { double angle = Math.Atan2(((double)y - centerY) / bitmap.PixelHeight, ((double)x - centerX) / bitmap.PixelWidth); double fraction = angle / (2 * Math.PI); pixels = (byte)(fraction * 255); // Blue pixels = 0; // Green pixels = (byte)(255 * (1 - fraction)); // Red pixels = 255; // Alpha } using (Stream pixelStream = bitmap.PixelBuffer.AsStream()) { await pixelStream.WriteAsync(pixels, 0, pixels.Length); } bitmap.Invalidate(); imageBrush.ImageSource = bitmap; } } }

Этот угол преобразуется в дробную величину в диапазоне от 0 до 1 для вычисления градиента. Вот как выглядит полное растровое изображение, используемое объектом ImageBrush, заданным свойству Fill объекта Ellipse:

Как было показано ранее, кисти в Windows Runtime обычно растягиваются по элементу, к которому они применяются. С кистью ImageBrush происходит то же самое, так что в каком-то смысле размер базового изображения не так уж важен... До определенной степени, конечно, - слишком маленькое изображение не обладает достаточной детализацией, а слишком большое превращается в напрасную трату пикселов.

Когда растровое изображение отображается на поверхности (скажем, на экране монитора), его пикселы не всегда просто передаются на поверхность. Если растровое изображение поддерживает прозрачность, каждый пиксел должны объединяться с цветом существующей поверхности в соответствующей точке на основании альфа-канала этого пиксела. Если альфа-канал равен 255 (полная непрозрачность), пиксел изображения просто копируется на поверхность. Если альфа-канал равен 0 (прозрачность), пиксел вообще не копируется. Если альфа-канал равен 128, результатом является среднее значение цвета пиксела изображения и цвета поверхности перед выводом.

Следующие формулы демонстрируют соответствующие вычисления для одного пиксела. В реальности значения A, R, G и B лежат в диапазоне от 0 до 255, но следующие упрощенные формулы предполагают, что они были нормализованы до диапазона от 0 до 1. Подстрочные пояснения обозначают «результат» отображения частично прозрачного пиксела «изображения» на существующей «поверхности»:

Обратите внимание на второе умножение в каждой строке. В нем задействован только сам пиксел изображения, но не поверхность. Отсюда следует, что весь процесс отображения растрового изображения на поверхности можно ускорить предварительным умножением значений R, G и В пиксела на величину А:

Допустим, растровое изображение без предумножения альфа-канала содержит пиксел со значением ARGB (192,40,60,255). Альфа-канал 192 обозначает 75-процентную непрозрачность (192, деленное на 255). Эквивалентный пиксел с предумножением альфа-канала имеет вид (192, 30, 45, 192): красная, зеленая и синяя составляющие были умножены на 75 %.

При отображении WriteableBitmap операционная система предполагает, что пиксел имеет формат с предумножением альфа-канала. У произвольного пиксела ни одно из значений R, G и В не может превышать значение А. Если это условие не выполняется, ничего ужасного не случится, но вы не получите желаемые цвета и уровни прозрачности.

Рассмотрим несколько примеров. В статье "Масштабирование элементов в WinRT" было показано, как перевернуть изображение и «растворить» его, чтобы оно выглядело как отражение. Но поскольку Windows Runtime не поддерживает маски прозрачности, для реализации эффекта прозрачности мне пришлось накрыть изображение полупрозрачным прямоугольником.

В проекте ReflectedAlphaImage было использовано другое решение. Файл XAML содержит два элемента Image, занимающих одну ячейку панели Grid из двух строк. Для второго элемента Image задаются свойства RenderTransformOrigin и ScaleTransform, обеспечивающие его «отражение» относительно нижней стороны, но изображение при этом не указывается:

.jpg" HorizontalAlignment="Center" />

Растровое изображение, на которое ссылается первый элемент Image, должно загружаться независимо в файле фонового кода. (Возможно, у вас возник вопрос - нельзя ли получить объект WriteableBitmap на основе объекта, заданного свойству Source первого объекта Image? Но этот объект относится к типу BitmapSource, а создать WriteableBitmap по BitmapSource невозможно.) Если изменять загруженное изображение не требуется, конструктор может выглядеть примерно так:

Loaded += async (sender, e) =>.jpg"); RandomAccessStreamReference refStream = RandomAccessStreamReference.CreateFromUri(uri); IRandomAccessStreamWithContentType fileStream = await refStream.OpenReadAsync(); WriteableBitmap bitmap = new WriteableBitmap(1, 1); bitmap.SetSource(fileStream); reflectedImage.Source = bitmap; };

Этот код следует поместить в обработчик Loaded, потому что в нем используется асинхронное выполнение. Обратите внимание на возможность создания WriteableBitmap с фактически «неизвестным» размером при поступлении данных из метода SetSource. Читая поток JPEG, объект WriteableBitmap может определить фактические размеры в пикселах.

Однако когда объект FileStream передается методу SetSource объекта WriteableBitmap, а также при его задании свойству Source элемента Image, растровое изображение еще не загружено. Загрузка осуществляется асинхронно в коде WriteableBitmap. Это означает, что приступать к изменению пикселов пока нельзя, потому что данные еще не получены! Конечно, было бы удобно, если бы класс WriteableBitmap определял событие, инициируемое при завершении загрузки растрового изображения в SetSource, но такого события нет. Событие ImageOpened элемента Image также не может предоставить эту информацию WriteableBitmap.

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

Using System.IO; using Windows.UI.Xaml; using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Controls; using System.Runtime.InteropServices.WindowsRuntime; using System; using Windows.Storage.Streams; namespace WinRTTestApp { public sealed partial class MainPage: Page { public MainPage() { this.InitializeComponent(); Loaded += MainPage_Loaded; } private async void MainPage_Loaded(object sender, RoutedEventArgs e).jpg"); RandomAccessStreamReference refStream = RandomAccessStreamReference.CreateFromUri(uri); // Создание буфера для чтения потока Windows.Storage.Streams.Buffer buffer = null; // Чтение всего файла using (IRandomAccessStreamWithContentType fileStream = await refStream.OpenReadAsync()) { buffer = new Windows.Storage.Streams.Buffer((uint)fileStream.Size); await fileStream.ReadAsync(buffer, (uint)fileStream.Size, InputStreamOptions.None); } // Создание объекта WriteableBitmap с неизвестным размером WriteableBitmap bitmap = new WriteableBitmap(1, 1); // Создание потока памяти для передачи данных using (InMemoryRandomAccessStream memoryStream = new InMemoryRandomAccessStream()) { await memoryStream.WriteAsync(buffer); memoryStream.Seek(0); // Поток в памяти используется как источник данных Bitmap bitmap.SetSource(memoryStream); } // Получение пикселов из растрового изображения byte pixels = new byte; int index = 0; using (Stream pixelStream = bitmap.PixelBuffer.AsStream()) { await pixelStream.ReadAsync(pixels, 0, pixels.Length); // Применение прозрачности к пикселам for (int y = 0; y < bitmap.PixelHeight; y++) { double opacity = (double)y / bitmap.PixelHeight; for (int x = 0; x < bitmap.PixelWidth; x++) for (int i = 0; i < 4; i++) { pixels = (byte)(opacity * pixels); index++; } } // Пикселы помещаются обратно в изображение pixelStream.Seek(0, SeekOrigin.Begin); await pixelStream.WriteAsync(pixels, 0, pixels.Length); } bitmap.Invalidate(); reflectedImage.Source = bitmap; } } }

Имя класса Buffer должно задаваться полностью уточненным, с включением пространства имен Windows.Storage.Streams, потому что в пространстве имен System тоже присутствует класс с именем Buffer.

Одна из наших целей - передача объекта типа IRandomAccessStream методу SetSource объекта WriteableBitmap. Однако мы хотим немедленно приступить к работе с пикселами полученного изображения, а это невозможно, пока файл не будет прочитан полностью.

Этим объясняется создание объекта Buffer для чтения объекта fileStream и последующее использование того же объекта Buffer для чтения содержимого в InMemoryRandomAccessStream . Как подсказывает название, класс InMemoryRandomAccessStream реализует интерфейс IRandomAccessStream, чтобы его экземпляры можно было передавать методу SetSource класса WriteableBitmap (обратите внимание на необходимость предварительного обнуления позиции в потоке).

Важно понимать, что здесь мы работаем с двумя разными блоками данных. Объект fileStream соответствует файлу PNG, который в данном случае представляет собой блок из 82 824 байт сжатых графических данных. Объект InMemoryRandomAccessStream содержит тот же блок данных. После того как поток будет передан методу SetSource класса WriteableBitmap, он декодируется на строки и столбцы пикселов. Размер массива pixels составляет 512 000 байт, и объект pixelStream работает с этими распакованными пикселами. Объект pixelStream сначала используется для чтения пикселов в массив pixels, а затем для их записи обратно в изображение.

Если вы хотите посмотреть, что произойдет при изменении одного лишь альфа байта, замените следующий код внутреннего цикла:

If (i == 3) { pixels = (byte)(opacity * pixels); index++; }

Между двумя вызовами выполняется непосредственное применение градиентной прозрачности. Если бы среда Windows Runtime не предполагала, что пикселы WriteableBitmap хранятся в формате с предумножением альфа-канала, то достаточно было бы модифицировать только альфа-байт. С предумножением альфа-канала также необходимо модифицировать и цветовые данные. Результат выглядит так:

Нужный уровень прозрачности достигается, но только при использовании белого фона. Если фон будет черным, прозрачности не будет вообще! Взгляните на формулы, и вам все станет ясно.

Предположим, вы хотите изменить проект CircularGradient так, чтобы в нем использовался градиент от однородного цвета к полной прозрачности. Измененный код для задания четырех байтов выглядит так:

Pixels = (byte)(fraction * 255); // Blue pixels = 0; // Green pixels = 0; // Red pixels = (byte)(fraction * 255); // Alpha

Синему и альфа-компоненту присваиваются одинаковые значения. В формате без предумножения альфа-канала синяя составляющая всегда будет равна 255. Результат:

Давайте рассмотрим работу с альфа-каналами: сохранение, обработка, загрузка выделений, логические операции.

Наверное, вы уже сталкивались с тем, что одну и ту же область приходится выделять несколько раз в процессе редактирования изображения. А если эта область имеет сложную форму, то каждый раз повторяется один и тот же мучительный процесс.. Безрадостно. Хотелось бы сохранить где-то созданное выделение и загружать его по мере потребностей. Именно такую возможность предоставляют альфа-каналы - объекты Photoshop, позволяющие хранить выделения. Поскольку выделять можно с разной степенью прозрачности, то в альфа-каналах хранятся маски - представления выделений в виде градаций серого, где белый цвет соответствует выделенным областям, черный - невыделенным, серый - частично выделенным. Итак, помощью альфа-каналов можно сохранять, загружать и редактировать выделения. Работа с альфа-каналами напоминает работу в быстрой маске. Рассмотрим это на примере.

Сохранение и загрузка выделений.


Редактирование выделений в альфа-каналах. Работа с градиентными масками.


Логические операции с альфа-каналами.

Если при выборе пункта меню Select > Save Selection в списке Channel выбрать имя существующего канала, то у программы возникает естественный вопрос: если мы пытаемся поместить туда что-то новое, то что же делать со старым? Правила взаимодействия старого и нового содержимого канала определяются при помощи логической операции, выбранной в поле Operation .


Эти операции вам уже знакомы. При выборе пункта Replace Channel всё содержимое канала будет заменено на новое сохраняемое выделение. Если Вы включите переключатель Add to Channel , то к выделению, сохранённому в канале, будет добавлено сохраняемое выделение (операция сложения выделений). Операции вычитания (Substract from channel ) и пересечения (Intersect with channel ) выполняются аналогично подобным операциям с выделениями. Обязательно попробуйте работу этих операций. Только учтите, что пересечь или вычесть выделение из канала можно только в том случае, если сохраняемое выделение "перекрывает" уже сохранённое в данном канале. (т.е. они должны иметь общие области, иначе нечего будет пересекать и вычитать).


При загрузке выделения из канала с помощью пункта меню Select > также возможна логическая операция при условии, что мы будем загружать выделение в файл, уже содержащий выделенную область. Взаимодействовать будут старое выделение и новое, загружаемое из альфа-канала. Все операции стандартны.

В отличие от векторного обтравочного контура, альфа-канал — дополнительный растровый канал в изображении (в градациях серого), сохраняющий информацию о его прозрачных областях. Градации серого определяют степень прозрачности участков изображения. Альфа-канал можно переименовывать, редактировать и применять к нему различные фильтры — в этом отношении он совершенно равноправен с остальными каналами.

Здесь и таятся его плюсы и минусы: с каждым новым каналом значительно увеличивается размер файла (величина видимой части изображения не важна — в памяти канал занимает всю площадь изображения); зато можно создавать области с частичной прозрачностью, а поскольку маска представляет собой обычное растровое изображение, работать с нею привычными инструментами (кистями).

Изображения, имеющие альфа-каналы с частичной прозрачностью, в полном объёме (с адекватным отображением областей с различной прозрачностью) поддерживаются немногими приложениями. Из известного автору не-графического ПО только Internet Explorer 5.5 и выше поддерживает её в формате PNG. Остальные (в т. ч. верстальные пактеты) ограничиваются возможностями альфа-каналов лишь на уровне «прозрачно/непрозрачно». Правда, в них предусмотрена установка порога между этими состояниями вручную (можно задать, что 10% яркость, а не 50%, как обычно, в канале определит полностью прозрачные области). Учитывая реальные возможности программ, под альфа-каналом чаще подразумевают маску абсолютной прозрачности изображения, т. е. рассматривают его исключительно как чёрно-белый.

В разных редакторах прозрачность передаётся разными цветами: одни считают, что прозрачные области определяются чёрным цветом (так поступает Photoshop), другие — белым (PhotoPAINT). Как правило, все более-менее серьёзные растровые редакторы позволяют конвертировать обтравочный контур в маску прозрачности и наоборот — выделенную область оттрассировать в векторный контур.

Для дальнейшей работы в векторных или верстальных пакетах с изображением, имеющим полупрозрачные области , их записывают в виде альфа-канала (или нескольких каналов), а само изображение сохраняют в формате TIFF. Хотя DCS 2 и поддерживает прозрачность, большинство редакторов (тот же Photoshop) информацию об альфа-каналах в нём всё равно не сохраняет. Что касается возможности TIFF записывать многослойное изображение в виде отдельных слоёв, то корректно их воспринимают лишь векторные редакторы (Illustrator, CorelDRAW) последних версий. Следовательно, для работы с верстальными пакетами такая разновидность TIFF не подходит.

Создание альфа-каналов в различных редакторах практически идентично: отличия лишь в терминологии.

Adobe Photoshop

Выделенную область изображения в редакторе создают инструменты Lasso, Polygonal Lasso и Magic Wand. Для быстрого сохранения её в виде альфа-канала предназначена кнопка Save selection as channel (Сохранить выделение как канал) — палитра Channels (Каналы). Содержимое просматривается после активации канала.

Второй вариант — режим Quick Mask (Быстрая маска), показывающий одновременно само изображение и его маску, редактируемую всеми доступными методами: кистью, аэрографом, ластиком и т. п. Но созданная маска является временной; для сохранения её нужно конвертировать в альфа-канал (панель Channels/New channel) либо через Select/Save Selection (Выделение/Сохранить выделение). При сохранении информации в альфа-канале есть выбор: создание нового канала или любая из основных операций (добавление, вычитание, нахождение общей части) с уже существующим.

При сохранении изображения в формате TIFF с альфа-каналом убедитесь, что флажок Alpha channel установлен (редактор сам подскажет об этом, сигнализируя значком предостережения возле данной опции).

Corel PhotoPAINT

Инструменты для создания маски похожи на имеющиеся в Photoshop. Любым из доступных способов создаётся область выделения (current mask) и затем сохраняется в виде альфа-канала через пункт New Channel из свитка Channels (или через Mask/Save/Save as channel). Редактирование маски проводится стандартными методами (инструментами рисования) или при помощи группы инструментов Mask. Характер будущей операции нужно задавать явно (Additive или Subtractive mode).

Интересная особенность — сохранение области выделения на диске в виде отдельного файла (Mask/Save/Save Mask to Disk). А загружают его командой Load/Load from Disk.

Сохранение файлов с альфа-каналами никаких дополнительных установок не требует.

ИЗДАТЕЛЬСКИЕ СИСТЕМЫ

Мы рассмотрели вопросы создания и редактирования масок прозрачности на предварительных этапах подготовки публикации. На конечном все заготовки собираются в пакете вёрстки.

Все издательские пакеты имеют развитые механизмы управления векторными обтравочными контурами и растровыми масками изображений. Кроме функций обрезания части изображения, маски используются для указания границ обтекания текстом иллюстраций . Поэтому параметры операций в редакторах (clipping и runaround) идентичны.

Каждый редактор имеет и уникальные особенности. Главное преимущество Adobe InDesign — полная совместимость с остальными продуктами Adobe, позволяющая с лёгкостью перемещать документы из одного приложения в другое, придавая изданию должную художественную выразительность. Полностью поддерживаются все возможности форматов PSD и AI как универсальных средств обмена между приложениями Adobe (маски полупрозрачности, растровые эффекты). К сожалению, остальные редакторы подобной гибкостью не обладают — они работают через стандартные TIFF и EPS со всеми вытекающими ограничениями.

PageMaker

Старожил рынка вёрстки, увы, больше развиваться не будет. Но в седьмой версии появились несколько полезных новшеств: работа с PDF и полная поддержка родных «семейственных» форматов — PSD и AI. Нововведения частично снимают ограничения предыдущих версий — теперь без проблем в макете применяются иллюстрации с прозрачностью. Согласитесь, от поддержки PSD и AI редактор выиграл куда больше, чем, например, от поддержки маски прозрачности (к тому же однобитовой).

Но и здесь не обошлось без ложки дёгтя: растровые маски прозрачности в PSD редактор не распознаёт — только векторные. Так и остались нереализованными функции автоматического обтекания текстом изображений с прозрачностью и различных геометрических фигур. Как и раньше, для таких операций придётся вручную создавать границы обтекания, что сейчас выглядит полным анахронизмом. Регулировки отступа в пакете отсчитываются только от габаритных размеров объекта (bounding box), а не относительно его реальных границ — соответственно, остаются не востребованы.

Когда в EPS не записано его экранное представление, пакет выполняет растрирование из PostScript самостоятельно, но не особо в этом силён — картинка часто воспроизводится некорректно (например, в виде белого фона). Если внедряется EPS с цветной экранной копией содержимого, то в ранних версиях программы прозрачные области отображаются некорректно. Выход — в сохранении таких файлов с ч/б preview (в 7-й версии проблема решена).

Имеются сложности и со вставкой иллюстраций формата TIFF: к сожалению, информация о прозрачности, основанная на обтравочных контурах и сохранённая через PhotoPAINT, им не поддерживается. Сохраняйте такие изображения в формате EPS. Как видите, проблем у редактора предостаточно — поэтому его и используют в основном для вёрстки продукции, в которой не нужно делать особых изысков, вроде обтекания сложных контуров.

QuarkXPress

XPress — флагманский пакет компании Quark. По средствам художественной выразительности ветеран в сфере вёрстки уступает молодой поросли, зато легко оперирует альфа-каналами и обтравочными контурами для маскирования части изображения и управления обтеканием текста. Кроме работы с обтравочными контурами, импортированными вместе с изображениями, XPress предоставляет широкие возможности по их созданию своими силами.

Для доступа ко всем параметрам надо выбрать контейнер с иллюстрацией и нажать либо выполнить команду Item/Clipping (для управления обтеканием текста — Item/Runaround). В появившемся диалоговом окне по умолчанию активным будет Embedded path или Alpha channel — в зависимости от того, в каком именно виде сохранена информация о прозрачности.

Возможности при работе с EPS и TIFF в редакторе существенно разнятся. Для первого обтравочным контуром будет тот, что назначен в растровом редакторе. Никаких других «вольностей» не предусмотрено. Для обтекания текстом допускается большая свобода: можно выбирать любой путь, существующий в изображении, при этом становится доступной масса дополнительных параметров. Максимальна гибкость при работе с TIFF: выбор любого типа маски и, естественно, полный набор средств управления ими.

Какие же параметры масок прозрачности регулируются?

Во-первых, выбор обтравочного контура или альфа-канала, который будет рабочим. Становится доступна для редактирования группа параметров Tolerance, где собраны настройки точного управления масками.

Outset предназначен для расширения или сужения границы контура. Популярная область его применения — задание расстояния между иллюстрацией и обтекающим её текстом. Максимальное значение зазора — 288 типографских пунктов (points), т. е. чуть более 20 см.

Noise определяет минимальный размер контура (в точках), учитываемый редактором. Обычно используется, если в графическом редакторе маскируемые области были сделаны инструментами типа Magic Wand без последующего сглаживания их границы, что приводит к созданию множества крошечных путей.

Smoothness задаёт точность воспроизведения контура: чем значение меньше, тем точнее принтер «обрежет» иллюстрацию, но и контрольных точек будет создаваться больше. Если их значение превысит некоторое пороговое, QuarkXPress автоматически сократит количество путём интерполяции.

Параметр Threshold задаётся в случае использования не ч/б битовых масок, а в градациях серого: поскольку граница маски чётко не очерчена, обтравочный контур может быть проведён где угодно. Значение Threshold определяет пороговую яркость, отделяющую маскируемые участки от немаскируемых. Если задан порог 10%, будут видимы только пиксели с яркостью 11% и выше.

Из собственных возможностей QuarkXPress по созданию прозрачных областей остановимся на режимах Non-white area и Auto Image. В первом случае пакет анализирует информацию об областях с белым цветом. Режим мало востребован в силу того, что изображение должно удовлетворять определённым критериям (иметь чёткую границу между областями), что случается крайне редко. Некоторую помощь оказывает параметр Threshold, но проще и быстрее провести предварительную подготовку изображения в графическом редакторе.

Дополнительные настройки пакета — Restrict to box (ограничить границу прозрачности размерами контейнера, содержащего иллюстрацию) и Invert (инвертировать границу маски). Первая часто помогает упростить путь за счёт игнорирования контрольных точек, расположенных вне зоны видимости.

Кнопка Rescan предназначена для того, чтобы увидеть эффект от выбора новой маски прозрачности. Для простого изменения параметра маски используйте Apply. А если нужно вообще отказаться от использования маски, выберите из списка её типов пункт Item.

Контролировать сложность формируемой кривой можно по информационному полю Information, в котором собраны все данные по текущему объекту. Даже если указан альфа-канал, редактор всё равно его трассирует и указывает количество полученных контрольных точек в кривой.

Кроме развитых функций управления прозрачностью, установленной в графических редакторах, QuarkXPress позволяет в любой момент изменять форму маски собственными средствами. Но это кропотливый процесс, сначала оцените сложность кривой по полю Information. Как правило, при вёрстке обтекание текстом (закладка Runaround) напрямую связывается с формой обтравочного контура (закладка Clipping). Для объединения процессов в закладке Runaround есть пункт Same As Clipping — все изменения, вносимые в форму контура, будут автоматически влиять на перераспределение текста. Если пришлось менять форму пути, который обтекает текст, проверьте значение поля в Preferences/Interactive/Delayed Item Dragging/Delay, это ускорит процесс редактирования.

Переход в ручной режим редактирования внедрённого контура происходит по нажатию (или командой Item/Edit/Clipping Path). Обтравочный контур становится видимым — со всеми составляющими контрольными узелками. Инструмент Item передвигает, добавляет и удаляет узелки, меняет их тип, тип сегментов, регулирует направляющие — QuarkXPress преображается в обычный векторный редактор. Элементы управления появляются в палитре Measurements. Для добавления или удаления узелков — клавиша; двигаются как отдельные узелки, так и целые сегменты. После придания завершённой формы очередное нажатие вернёт в обычный режим вёрстки. Если затем выполнить Item/Clipping, активным будет тип User-Editing Path. Будьте осторожны: выбор любого другого типа приведёт к потере информации об отредактированном вручную пути.

Журналов в свободном доступе.

Альфа-канал это информация о прозрачности определенных участков видео. Другими словами это видео с прозрачным фоном.

Альфа-канал позволяет оставить нужные нам объекты видимыми, а не нужное пространство сделать прозрачным. По сути, действует альфа-канал так же, как действует маска. Поэтому его иногда называют маска-канал.

В отличи от работы с масками, работа с альфой гораздо проще. Если видеоролик содержит альфа-канал, то все что нам нужно сделать, чтобы добиться нужного а – просто включить его.

Как использовать альфа-канал в Sony Vegas

Для примера мы возьмем видеокомпозицию с использованием черно-белой маски «два сердца», которую мы сделали в уроке « » (рис.4). Удалим из этой композиции клип 1 и клип 2, так как когда футаж будет готов, вместо них мы сможем подставить любое видео или фото.

В Sony Vegas есть возможность получить видео содержащее альфа-канал в одном из двух форматов.mov или.avi.

В меню file выбираем команду render as… (рис. 5)

В появившемся окне в поле «имя файла» дадим имя файлу. В поле «тип файла» выбираем Quick time 7 (*.mov). В поле template (шаблон) выбираем Default Template (uncompressed) (шаблон по умолчанию (без сжатия)), и нажимаем кнопку custom…(пользовательский) (рис. 6).

В появившемся окне (рис. 7), в поле Frame size (размер рамки) выбираем шаблон видео, который мы хотим получить на выходе. В поле Frame rate (частота кадров) выбираем нужный вам шаблон частоты кадров. Самое главное в поле Compressed depth (глубина сжатия) выбрать 32 bpp color (32 миллиона цветов), в противном случае альфа-канал не сохранится.

Чтобы футаж с альфой не содержал звуковой дорожки можно перейти на вкладку audio и снять галочку в поле Include audio (включите аудио) (рис. 8). Это немного уменьшит размер вашего файла.

После всех настроек нужно нажать на кнопку ОК, а в следующем окне на кнопку сохранить. Вот и все, теперь полученное видео будет содержать альфа-канал.

Если вы хотите вывести видео с альфой в avi, нужно сделать все также, как в первом примере, только в поле «тип файла» вместо Quick time 7 (*.mov). нужно выбрать Video for Windows (*.avi).

Затем, нажав на кнопку custom… в поле Compressed depth (глубина сжатия) выбрать uncompressed (без сжатия) и поставить галочку в поле Render alpha channel (uncompressed video formats only) (выводить альфа-канал). (рис. 9).

Основным недостатком футажей с альфой, является их размер. Так как сжатие в этом случае не используется, то размеры файла достаточно велики. В любом случае вам решать, что для вас важнее, сэкономленное благодаря использованию альфа-канала время, или место на жестком диске.