Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Заметки Дизайнера" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Февраль 2006 → | ||||||
1
|
2
|
3
|
4
|
5
|
||
---|---|---|---|---|---|---|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
25
|
||
27
|
28
|
Статистика
-2 за неделю
Построй свой сайт на PHP!
Построй свой сайт на PHP! |
||
Здравствуйте, уважаемые читатели!
Итак, вот и обещанный выпуск. Не буду устраивать особенных лирических отступлений. Если хотите пообщаться, просто заходите на форум webdeveloper.net.ru, мой блог, пишите письма или стучитесь в ICQ: #233661333. С уважением, Олег Шимчик (The Wanderer)
Забавы с картинкамиОт переводчикаЭта статья является переводом заметки Image fun, опубликованной в блоге phpied.com. Естественно, это накладывает определенный отпечаток на манеру подачи материала. Однако, как мне кажется, заметка сама по себе достаточно интересна и самодастаточна и не требует каких-либо дополнительных изменений, поэтому все было оставлено в исходном виде. Приятного чтения! Вот несколько примеров работы с изображениями с использованием библиотеки GD. Точнее, операций с пикселами. Операция с пикселом подразумевает какое-либо действие над отдельным пикселом в изобрежении без учета его соседей. Примером операции с пикселами является создание негатива изображения. Вы берете каждый пиксел в изображении и заменяете его пикселом противоположного цвета. Итак, как это все работает. Очень просто. Я беру PNG-изображение, перебираю все его пиксели и вызываю функцию, которой пиксел передается как параметр. Функция возвращает новый пиксел. Я собираю все возвращенные пикселы и создаю изображение. Класс PixelДля начала я создал класс Pixel. Он просто включает в себя три целых значения: значения содержания красного, зеленого и синего в пикселе.
<?php
У этого класса всего один метод, конструктор класса, который занимается предварительной обработкой значений RGB. Для создания красного пикселя вам просто нужно написать:
<?php
Класс для операций над пикселами и главный методЗатем я создал класс для операций над пикселами, который я назвал
Image_PixelOperations. Я не ставил своей задачей создать удобный интерфейс для чтения
и записи разных файловых форматов, я думаю, что этот класс можно разрабатывать дальше
и взять в качестве основы PEAR Image_Transform, который имеет инструменты для открытия,
проверки, отображения и записи файлов изображений. Все, что мне было нужно, это простой метод, который
открывает PNG, перебирает все пиксели, вызывает функцию, получает новый пиксел и записывает его
в изображение. Итак, метод
<?php
В качетсве первого параметра метод принимает имя файла, он не делает никаких проверок, предполагая, что перед ним
правильный PNG-файл. Второй параметр - имя выходного файла. Третий - это имя функции, которая
будет вызвана для каждого пиксела, последний параметр - это любой параметр, который вы хотите передать
вызываемой функции. Добавляем шумПора написать первую функцию, метод addNoise. Добавление шума к изображению означает добавление случайного значения каждому каналу пиксела. (Если вы не знаете, значение красного в пикселе называется каналом, то же самое касается и синего с зеленым). Вот реализация
<?php
Здесь мы генерируем случайное значение в заданом пользователем диапазоне и добавляем его к пикселу. Заданный пользователем диапазон - это число в интервале от 0 до 255, где 0 означает меньший уровень шума, а 255 - больший. Хорошо, 0 означает, что шума нет, а 255 означает кучу шума, 255 - это не граница, вы можете задать большее значение, но чем больше значение, тем больше шума и практически ничего от исходного изображения. Давайте проверим! Я сделал простейшую HTML-форму: <form method="get"> <input name="image" /> <input type="submit" /> </form> Я задаю в форме имя изображения и отправляю ее. Затем, если что-то было отправлено, я создаю объект класса Image_PixelOperations:
<?php
Затем я вывожу оригинальное изображение, вызываю метод pixelOperation и отображаю результат:
<?php
Результат: Изменения уровня шума дают следующие результаты (первый имеет фактор шума 20, а второй 500): ЯркостьДалее изменение яркости. Это опять ничто иное, как добавление целого значения к каждому каналу всех и каждого пиксела. Добавляя, мы увеличиваем яркость изображения, вычитая, мы делаем его более темным. Вот соответствующий метод:
<?php
Для того, чтобы протестировать этот код, мы делаем следующее:
<?php
Это дает нам: Замена цветовДалее замена цветов. Это означает, к примеру, что мы берем количество красного в пикселе и заменяем его количеством синего в том же пикселе. Итак, вот возможные варианты замены:
Реализация метода достаточно проста:
<?php
Проверка различных вариантов: Удаление и стимуляция цветовДалее у нас еще два метода. Один устанавливает канал в ноль (к примеру, "нет красного!") другой увеличивает канал до максимума. Или два канала. Таким образом, у нас есть шесть вариантов для каждого метода:
(Не имеет особого смысла удаление или увеличение до максимума всех трех каналов. Почему?) Реализация:
<?php
И тесты: НегативДовольно просто превратить канал в негатив. Логика следующая: у вас много красного? Будет мало.
<?php
Тест выдает нам: Шкала серогоЯ не знаю, знаете ли вы, но серый - это цвет, в котором одинаковое количество красного зеленого и синего. Более темные оттенки серого имеют большее красного, зеленого и синего, более светлые - меньше. Чтобы превратить изображение в сверое мы берем среднее значение красного, зеленого и синего и присваиваем всем трем каналам это среднее значение.
<?php
Тест: Черный и белыйВ отличие от серого, имеющего оттенки, у черно-белого изображения всего два цвета: черный (0, 0, 0) и белый (255, 255, 255). Мы используем коэффициент для того, чтобы определить какая граница подходит больше. Я имею в виду, что мы будем считать белым, а что черным. Самая простая логика - это просуммировать R+G+B и если сумма ближе к 255+255+255, чем к 0 (0+0+0), то мы считаем цвет белым, в противном случае - черным. Использование коэффициента дает нам большую гибкость при разграничении черного и белого. (Это отражает субъективность реального мира ;) )
<?php
Проверка с коэффициентом 20: ОбрезаниеС этого момента я начал розыск в интернете на предмет охоты за новыми пикселными операциями. И где-то нашел описание этого метода обрезания. Я не знаю, насколько все это полезно (может быть, я что-то не так понял). Вкратце смысл заключается в удалении близких к граничным значений и замене их на 0 или 255. Так что, если у вас есть цвет (5, 155, 250), то он станет (0, 155, 255). Опять же есть коэффициент, который дает гибкость в разграничении. Я не уверен, насколько все это полезно, единственное, что мне приходит в голову, это уменьшение размера файла, так как новое изображение использует меньше цветов. В любом случае, вот реализация и тест.
<?php
Обрезание с коэффициентом 100: Изменение контрастаЭто не пикселная операция, потому что она принимает во внимание все пикселы в изображении для того, чтобы решить, как поступить с данными пикселем. Изменение контраста требует так называемой средней освещенности. Для того, чтобы посчитать среднюю освещенность вам нужна формула, скопированная мной, так что вот реализация:
<?php
Сама по себе функция изменения контраста проста:
<?php
Тесты с уменьшенным и увеличенным значениями контраста (коэффициенты 0.5 и 1.5): Соль и перецЯ взял идею с этой страницы. Основа идем заключается в рассеивании случайных белых (соль) и черных (перец) пикселов. Реализация:
<?php
Проверка с фактором 20: Коррекция гаммы
<?php
Проверка с коэффициентом 2.2: Уравниваем вероятностиСмысл заключается в выборе случайной функции из описанных выше и вызове ее со случайным коэффициентом. Результат? Ну, научный способ создания самого худшего (или лучшего, в зависимости от того, как вы на это смотрите) цветного шума ;) Дальше?Я размышлял о двух функциях, которые могли бы оказаться полезными. Одна из них приводит пиксель к заданному заранее цвету. Я имею в виду, если какой-то цвет близок к тому, который мы хотим, сделаем его еще ближе. Это может быть полезным, если вы, к примеру, хотите сменить цветовую схему на сайте и сделать все изображения более розовыми, к примеру. На данный момент эксперименты проходят неплохо, но результаты не слишком многообещающие ;) Другая функция будет заменять один цвет другим, тоже используя схожесть. К примеру, возьмем все очень-очень яркие оттеник серого и сделаем их белыми. Затем, есть еще фильтры, набор операций, который учитывает не только данным пиксель, но и соседей. Примеры - размытие, определение краев и т.д. Кстати, полный исходный текст к этой заметке находится здесь. Расширять его просто, вам нужно всего лишь реализовать функцию обратного вызова для эффекта и передать ее при вызове pixelOperation. —————– Обновление:Спасибо Laurens Holst, который опубликовал этот комментарий о восприимчивости различных цветов человеческим глазом! Я создал новую функцию превращения цветов в оттенки серого, используя рекомендованную им формулу. В моей исходной функции я просто брал среднее значение R, G и B, теперь все эти цвета идут с коэффициентом. Затем я делю на сумму коэффициентов. Результат лучше! Вот эксперимент с тем же самым изображением Wiki (второе черно-белое изображени использует новую формулу) Новое изобажение выглядит чуть светлее, ничего особенного. Но я повторил эксперимент с изображением, найденным на SitePoint и, похоже, что изображение не только светлее, но и содержит больше информации, видимой человеческим глазом. Посмотрите внимательнее на то, что напоминает дисплей на кассовом аппарате. Второе черно-белое изображение выглядит более "информативным". Вот исходный код новой функции:
<?php
|
Copyright © 2004-2006 Построй свой сайт на PHP! Перепечатка возможна только с сохранением авторства. |
Выпуск #14: 2006-02-26 |
В избранное | ||