Как выбрать идеальный формат изображения.

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

Сегодня мы поговорим, что понятно из заголовка, да, - про формат пикселей , размер пикселей или соотношение пикселей (смотря как переводить, называть или как к этому относиться).

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

Давайте приступим.

Вводная

Чаще всего технологию переключения формата (соотношения) пикселей можно использовать (увидеть) в видеокартах семейства AMD Radeon , в поледних версиях драйвера и при условии, что у Вас монитор подключен по HDMI и всей этой радостью умеет управлять, что существует ужо довольно и относительно повсеместно.

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

Формата изображения, мол: "Кино ", "ПК " и тп, что, думаю, многие видели и наверняка заметили ни раз, когда при переключении меняется яркость, резкость, цветопередача и тп.

Давайте разбираться почему так.

Формат цветовой и немного кодирование

Дисплеи на HDMI могут использовать один из двух разных цветовых форматов: YCbCr и RGB . Эти цветовые форматы являются цифровым эквивалентом аналоговых сигналов Component Video (YPbPr) и D-Sub VGA (Video Graphics Array) .

Если говорить проще и точнее, то это скорее способы цветового кодирования, которые по разному этот самый цвет.. Ну не то чтобы отображают, а смешивают (интерпретируют) и результат сего вы потом наблюдаете на экрана своего дисплея. Или кодируют-раскодируют, так сказать.

Формально (очень) существует два основных , - это YCbCr и RGB . Давайте чуть отойдем от темы и поговорим про них.

Формат RGB

R ed G reen B lue - это цветовая модель (формат), как правило, описывающая способ кодирования цвета для цветовоспроизведения с помощью трёх цветов, которые принято называть основными. По первым буквам названия, - это:

  • Red , - красный;
  • Green , - зелёный;
  • Blue , - синий.

Изображение в данной цветовой модели состоит из трёх каналов. При смешении основных цветов, например, синего (B ) и красного (R ), получается пурпурный (M , magenta), зелёного (G ) и красного (R ) - жёлтый (Y, yellow ), зелёного (G ) и синего (B ) - циановый (С, cyan ). При смешении всех трёх основных цветов получается белый цвет (W, white ).

Считается основным форматом для ПК и в общем и целом. Каждый желающий может легко проверить это смешав любые два (или все три) где-нибудь в цветовой палитре с акварелью.

Формат YCbCr

Более "извращенное представление". Так же пишется как, Y′CbCr , или Y Pb/Cb Pr/Cr, Y’CBCR или YCBCR . Чаще всего используется при передачи передачи цветных изображений в компонентном видео и цифровой фотографии.

Y " - компонента яркости, CB и CR являются синей и красной цветоразностными компонентами. Y " (с апострофом) отличается от Y , которой обозначают яркость без предыскажения. Апостроф означает, что интенсивность света кодируется нелинейно с помощью гамма-коррекции.

Такая вот страшновывернутая штука:

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

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

И что всё еще с этим делать?

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

Всё из того же текста статьи (и даже ) можно понять, что поддерживают следующие форматы отображения HDMI :

    • Формат изображения YCbCr 4: 4: 4
    • Формат изображения YCbCr 4: 2: 2
    • RGB 4: 4: 4 (Pixel Format Sudio Limeted RGB)
    • RGB 4: 4: 4 (Pixle Format PC Full RGB )

На выходе мы с Вами знаем, что формат YCbCr содержит подмножество данных цветового кодирования, также называемую Chroma Subsampling и представленную в формате 4: n: n (Y: Cb: Cr) . Левая цифра обозначает яркость, средняя цифра представляет синий канал, а правая цифра - красный.

Формат RGB содержит ограниченные (16-235 бит ) и полные (0-255 бит ) параметры, которые представляют диапазон уровней белого и черного, которые могут отображаться.

Всё это конечно замечательно, много интересного написано, но всё еще ни черта не ясно, что же представляет из себя на практике и что с этим делать.

А делать вот что.

Формат пикселей на практике

На практике Вы покупаете дисплей, включаете в него проводки и радостно определяете, что с ним будете делать (играть, например), после чего его включаете. Дальше у вас несколько вариантов (следите за руками):

  • Вы выбираете первый формат пикселей (один из четырех) и пробуете пользоваться им с теми настройками, что есть изначально (заводские);
  • Вы оставляете этот формат пикселей (или размер пикселей, или соотношение пикселей, или как там Вашей душе удобно его называть к концу этой статьи, - хоть цветовое кодирование) и меняете яркость-контрастность-соотношение цветов-резкость-формат-черного и черт знает что там еще можно еще, пока картинка Вас не устроит (делается кнопочками на мониторе или пульте);
  • Вам очень интересно и вообще Вы практик, -после чего Вы выбираете второй формат пикселей и пробуете пользоваться уже им изначально, сбросив настройки;
  • Вы оставляете второй формат пикселей и меняете яркость-контрастность-соотношение цветов-резкость и черт знает что там еще можно еще, пока картинка Вас не устроит;
  • Сравниваете эти (следили за руками?) четыре варианта и пробуете третий (формат? размер? цветовое кодирование? да как хотите, хоть пространство), сбросив настройки настройки;
  • Теперь уже третий формат Вы подкручиваете под себя (кнопками на мониторе или пульте), сравниваете с первыми 4 -мя вариантами;
  • Если Вы не выкинули до сих пор монитор, то делаете так и с оставшимся форматом пикселей и настройками под него.

Итого Вы перепробовали 4 формата пикселей и 8 настроек под каждый (заводские и Ваши, т.к всё это всегда выглядит иначе во всех 8 случаях). Если здесь Вы еще не выкинули монитор, то Вы:

  • Либо останавливаетесь на каком-то формате с какими-то (Вашими или заводскими) настройками под Ваши цели (Вы еще не забыли, что вначале Вы выбирали для чего покупали монитор? Забыли? А пофиг, всё равно в глазах уже рябит);
  • Либо задолбались, купили устройство-паук и скалибровали монитор им и все мониторы в радиусе 300 км тоже;
  • Либо крайне терпеливый человек и на Вас надо воду возить.

Выбрали? Теперь проделайте всё тоже самое , но на каждом этапе распечатайте фотографию и сравните с изображением на мониторе. Прежде чем Вы всё уничтожите, давайте к послесловию.

Послесловие

Если Вы не профессионал, который очень любит "теплый" "ламповый звук", не разбираетесь в пауках, цветовых профилях мониторов и принтеров, гаммах, пространствах, оттенках, форматах, балансах белого и черт знает чем еще, то Вас просто устроит монитор, который Вы один раз сами настроили в любом из цветовых пространств. Если это компьютер, то, как как правило, - это Full RGB , если телевизор, то YCbCr 4: 4: 4. Всё.

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

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

То есть схема здесь такая - приложение отдает команды машине OpenGL, получая результат на поверхности своего окна. Такая архитектура называется "клиент - серверной", в роли клиента выступает наше приложение, в роли сервера - система OpenGL. Задача сервера - отрабатывать команды клиента. В принципе, сервер может располагаться и не на нашем компьютере, а удаленно, возможно и за тысячи километров от нас. Наше приложение должно передать серверу требуемые для работы данные - контексты и команды на языке сервера. Также важно понимать, что основную работу выполняет не наше приложение, а сервер. Наше приложение лишь создает окно - платформу для работы сервера, и передает команды серверу. При грамотном подходе нет разницы, какими средствами мы спроектировали приложение - С или Delphi, скорость воспроизведения целиком зависит от производительности сервера - машины OpenGL. Мы выбрали в качестве средства разработки приложений именно Delphi за выдающуюся скорость компиляции и обаятельность концепций.

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

Мы знаем, что ссылка на контекст устройства - величина типа HDC, для получения которой вызываем функцию GetDC. Ссылке на контекст устройства в Delphi соответствует свойство Canvas.Handle формы, принтера и некоторых компонентов. Теоретически всюду в наших примерах в строках, использующих величину DC типа HDC, вместо DC можно использовать Canvas.Handle. В первых примерах для начинающих это так и сделано. Каков же все-таки смысл контекста устройства, если он и так связан с однозначно определенным объектом - окном, областью памяти или принтером, и зачем передавать дополнительно какую-то информацию об однозначно определенном объекте?

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

Form1.Canvas.Ellipse (0, 0, 100, 100);

Printer.BeginDoc; Printer.Canvas.Ellipse (0,0,100,100); Printer.EndDoc;

рисуют один и тот же эллипс на поверхности формы и на распечатываемом документе соответственно, то есть на различных устройствах. Причем, если мы будем выводить разноцветную картинку на монохромный принтер, он справится с этой задачей, передавая цвета оттенками серого. Даже если мы рисуем только на канве формы, мы имеем дело с различными устройствами - нам неизвестно, какова графическая плата пользователя и каковы характеристики текущей установки настроек экрана. Например, имея в своем распоряжении более 16 миллионов цветов, приложение не заботится об отображении такой богатой палитры на экране, располагающем всего 256 цветами. Эти вопросы приложение перекладывает на плечи операционной системы, решающей их посредством драйверов устройств. Приложению для того, чтобы воспользоваться функциями воспроизведения Windows, необходимо только указать ссылку на контекст устройства, содержащую средства и характеристики устройства вывода.

Win32 Programmer"s Reference фирмы MicroSoft о контексте устройства сообщает следующее:

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

Термин "структура", встретившийся здесь, соответствует записи в терминологии Delphi. Контекст устройства Windows содержит информацию, относящуюся к графическим компонентам GDI, контекст воспроизведения содержит информацию, относящуюся к OpenGL, то есть играет такую же роль, что и контекст устройства для GDI. В частности, эти контексты являются хранилищами состояния системы, например, хранят информацию о текущем цвете карандаша.

Формат пикселя

Итак, ссылка на контекст устройства содержит характеристики устройства и средства отображения. Именно он знает, как выводить на конкретно это устройство. Упрощенно говоря, получив ссылку на контекст устройства, мы берем в руки простой либо цветной карандаш, или кисточку с палитрой в миллионы оттенков. Сервер OpenGL, прежде чем приступать к работе, также должен определиться, на каком оборудовании ему придется работать. Это может быть скромная персоналка, а может быть и мощная графическая станция. Прежде чем получить контекст воспроизведения, сервер OpenGL должен получить детальные характеристики используемого оборудования. Эти характеристики хранятся в специальной структуре, тип которой - TPixelFormatDescriptor (описание формата пикселя). Формат пикселя определяет конфигурацию буфера цвета и вспомогательных буферов.

Самый частый вопрос, который я получаю в связи с моими уроками, заключается в просьбе указать источники подробной информации об OpenGL на русском. К сожалению, если такие и есть, то мне они неизвестны. Главным нашим подручным станет поставляемый в составе Delphi файл помощи по OpenGL. Систему помощи Delphi для получения хороших результатов необходимо настраивать, если в помощи Delphi найти раздел по OpenGL, он не порадует обилием информации. В разных версиях Delphi настройка помощи выполняется по-разному, потребуются некоторые несложные манипуляции, но мы не будем тратить на это время. Будем использовать самый простой способ - контекстную помощь. Наберите в тексте модуля фразу "PixelFormatDescriptor", нажмите клавишу F1 и Вы получите подробную помощь об этом типе. Точно также мы будем получать помощь обо всех терминах, функциях и командах OpenGL.

Итак, мы получили обширное описание структуры PixelFormatDescriptor. Обращаю внимание, что мы видим раздел помощи MicroSoft, рассчитанной на программистов С и С++, поэтому описание использует термины и стилистику именно этих языков. Так, по традиции Delphi имена типов начинаются с префикса T, но нам не удастся найти помощь по термину TPixelFormatDescriptor. К сожалению, это не единственное неудобство, которое нам придется испытывать. Например, если сейчас мы заглянем в файл windows.pas и найдем описание записи TPixelFormatDescriptor, мы обнаружим, что в файле помощи не указаны некоторые константы, а именно: PFD_SWAP_LAYER_BUFFERS, PFD_GENERIC_ACCELERATED и PFD_DEPTH_DONTCARE. А константа, названная PFD_DOUBLE_BUFFER_DONTCARE, по-видимому, соответствует константе, описанной в модуле windows.pas как PFD_DOUBLEBUFFER_DONTCARE. Наверное, более поздние версии помощи и заголовочного файла исправят этот и другие неточности.

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

В каталоге Beginner/1 Вы найдете проект OpenGL_min.dpr, в котором я привел описание всех полей структуры TPixelFormatDescriptor на русском, в момент их первоначального заполнения. Делается это в процедуре SetDCPixelFormat, вызываемой между получением ссылки на контекст устройства и созданием контекста воспроизведения OpenGL. Посмотрим подробнее, что там делается. Полям структуры присваиваются желаемые значения, затем вызовом функции ChoosePixelFormat осуществляется запрос системе, поддерживается ли на данном рабочем месте выбранный формат пикселя, и вызовом функции SetPixelFormat устанавливаем формат пикселя в контексте устройства. Функция ChoosePixelFormat возвращает индекс формата пикселя, который нам нужен в качестве аргумента функции SetPixelFormat.

Заполнив поля структуры TPixelFormatDescriptor, мы определяемся со своими пожеланиями к графической системе, на которой будет происходить работа приложения, машина OpenGL подбирает наиболее подходящий к нашим пожеланиям формат, и устанавливает уже его в качестве формата пикселя для последующей работы. Наши пожелания корректируются применительно к реальным характеристикам системы. То, что машина OpenGL не позволит нам установить нереальный для конкретной машины формат пикселя, значительно облегчает нашу работу. Предполагая, что разработанное приложение будет работать на машинах разного класса, можно запросить "всего побольше", а уж OpenGL разберется на конкретной машине, каковы параметры и возможности оборудования, на котором сейчас будет происходить работа. На этом можно было бы и закончить разговор о формате пикселя, если бы мы могли полностью довериться выбору OpenGL.

Обратим внимание на поле структуры "битовые флаги" - dwFlags. То, как мы зададим значение флагов, существенно может сказаться на работе нашего приложения, и наобум задавать эти значения не стоит. Тем более, что некоторые флаги совместно ужиться не могут, а некоторые могут присутствовать только в паре с другими. В этом примере флагам я присвоил значение PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL, то есть сообщаю системе, что я собираюсь осуществлять вывод в окно, и что моя система в принципе поддерживает OpenGL. Я ограничился всего двумя константами из обширного списка, приведенного в модуле windows.pas, по каждой из которых в файле помощи приведено детальное описание.

Так, константа PFD_DOUBLEBUFFER включает режим двойной буферизации, когда вывод осуществляется не на экран, а в память, затем содержимое буфера выводится на экран. Это очень полезный режим, если в любом примере на анимацию убрать режим двойной буферизации и все команды, связанные с этим режимом, хорошо будет видно мерцание при выводе кадра. Константу PFD_GENERIC_ACCELERATED имеет смысл устанавливать в случае, если компьютер оснащен графическим акселератором. Флаги, заканчивающиеся на "DONTCARE" , сообщают системе, что соответствующий режим может иметь оба значения, то есть PFD_DOUBLE_BUFFER_DONTCARE - запрашиваемый формат пикселя может иметь оба режима - одинарной и двойной буферизации. Со всеми остальными полями и константами я предоставляю Вам возможность разобраться самостоятельно, только замечу, что поле iLayerType, описанное в windows.pas типа Byte, может, согласно помощи, иметь три значения: PFD_MAIN_PLANE, PFD_OVERLAY_PLANE и PFD_UNDERLAY_PLANE, однако константа PFD_UNDERLAY_PLANE имеет значение -1, так что установить такое значение не удастся.

OpenGL позволяет узнать, какой же формат пикселя он собирается использовать. Для этого необходимо использовать функцию DescribePixelFormat, заполняющую величину типа TPixelFormatDescriptor установленным форматом пикселя. На основе использования этой функции построим несложное приложение, позволяющее детальнее разобраться с форматом пикселя и подобрать формат для конкретного рабочего места.

В примере битовым флагам задаем все возможные значения одновременно, числовым полям задаем заведомо нереальное значение 64, и смотрим на выбор формата пикселя, сделанным OpenGL. Результат, который Вы получите - выбранный формат пикселя, я предсказать не смогу - он индивидуален для каждой конкретной конфигурации машины и текущих настроек. Возможно, Вы получите в результате, что режим двойной буферизации не будет установлен - напоминаю, многие флаги устанавливаются только в комбинации с другими определенными. Наше приложение позволяет менять параметры формата пикселя и устанавливать его заново. Чтобы видеть, что происходит воспроизведение, небольшая площадка на экране при каждом тестировании окрашивается случайным цветом, используя функции OpenGL. Поэкспериментируйте с этим приложением, например, определите комбинацию флагов для установления режима двойной буферизации. Посмотрите значение числовых полей формата при различной палитре экрана - 16, 24, 32 бита, но не 256 цветов. О выводе при палитре экрана в 256 цветов - отдельный разговор. Это приложение, в частности, дает ответ на вопрос - как определить, оснащен ли компьютер графическим акселератором. Повозившись с этим приложением, Вы найдете ответ на вопрос, на который я Вам ответить не смогу - как надо заполнить структуру TPixelFormatDescriptor для Вашего компьютера. Обратите внимание, что в коде я установил несколько проверок на отсутствие контекста воспроизведения, который может быть потерян по ходу работы любого приложения, использующего OpenGL - редкая, но возможная ситуация в штатном режиме работы системы и очень вероятная ситуация если, например, по ходу работы приложения менять настройки экрана.

Минимальная программа OpenGL

Теперь мы знаем все, что необходимо для построения минимальной программы, использующей OpenGL. Я привел два варианта этой программы - одна построена исключительно на функциях Windows API, другая использует библиотеку классов Delphi (проекты каталогов Beginner/1 и Beginner/2 соответственно).

Взглянем на головной модуль второго проекта. При создании формы задаем формат пикселя, в качестве ссылки на контекст устройства используем значение Canvas.Handle формы. Создаем контекст воспроизведения OpenGL и храним в переменной типа HGLRC. При обработке события OnPaint устанавливаем контекст воспроизведения, вызываем функции OpenGL и освобождаем контекст. При завершении работы приложения удаляем контекст воспроизведения. Для полной академичности можно включить строки, проверяющие, получен ли контекст воспроизведения, и не теряется ли он по ходу работы. Признаком таких ситуаций является нулевое значение переменной hrc. В минимальной программе я просто окрашиваю окно в желтоватый оттенок. Получив помощь по команде glClearColor, Вы можете узнать, что аргументы ее - тройка вещественных чисел в интервале , задающих долю красного, зеленого и синего составляющих в цвете и еще один, четвертый аргумент, о котором мы поговорим чуть позднее. Этому аргументу я в примере задал значение 1.0. Вообще то, аргументы glClearColor, согласно помощи, имеют неведомый тип GLclampf. Для того, чтобы разобраться с этим типом, отсылаю к строке

GLclampf = Single;

модуля opengl.pas.

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

Строку нашей программы

GlClear (GL_COLOR_BUFFER_BIT);

будем понимать как очистку экрана, фон при этом покрывается заданным цветом.

Проект, построенный только на функциях API, надеюсь, сейчас стал более понятным. Вместо Canvas.Handle используем собственную переменную dc, в обработчике события WM_PAINT реализуем действия, которые Delphi при обычном подходе выполняет за нас. Напоминаю, что для лучшей устойчивости работы обработчик WM_PAINT следовало бы написать так:

Dc:= BeginPaint (Window, MyPaint); wglMakeCurrent (dc, hrc); glClearColor (0.85, 0.75, 0.5, 1.0); glClear (GL_COLOR_BUFFER_BIT); wglMakeCurrent (dc, 0); EndPaint (Window, MyPaint); ReleaseDC (Window, dc);

А в обработчике WM_DESTROY следует перед PostQuitMessage добавить строку:

DeleteDC (dc);

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

Во всех своих примерах я приписал рекомендацию не запускать проекты, использующие OpenGL под управлением среды Delphi. Дело в том, что часто в таких ситуациях программа аварийно прерывается, выдавая сообщение "access violation -". Это происходит и в случае самой аккуратной работы с контекстами, и не связано с небрежностью работы программы. Некоторые программисты вину за это возлагают на софтверные драйверы и рекомендуют обновить их. Некоторые утверждают, что дело в Windows 9X, и под NT этого не происходит. Возможно, Вы тоже ничего такого не замечали и не можете взять в толк, о чем я сейчас веду речь. У меня такие окошки вылетают через раз на одном и том же проекте, хотя откомпилированный модуль работает превосходно. Я полагаю, что если драйверы не "глюкуют", когда приложение работает без среды Delphi, дело не только в драйверах.

Вывод на поверхность компонентов

Теоретически функциями OpenGL возможно осуществлять вывод не только на поверхность формы, а и на поверхность любого компонента, если у него имеется свойство Canvas.Handle, для чего при получении контекста воспроизведения необходимо указывать именно его ссылку на контекст устройства, например, Image1.Canvas.Handle. Однако чаще всего это приводит к неустойчивой работе, вывод "то есть, то нет", хотя контекст воспроизведения присутствует и не теряется. Я советую Вам всегда пользоваться выводом исключительно на поверхность окна. OpenGL прекрасно уживается с визуальными компонентами, как видно из примера TestPFD, если же необходимо ограничить размер области вывода, для этого есть стандартные методы, о которых мы обязательно будем беседовать в будущем.

Просто ради интереса приведу пример, когда вывод OpenGL осуществляется на поверхность панели, то есть компонента, не имеющего свойства Canvas. Для этого мы пользуемся тем, что панель имеет отдельное окно, вызываем функцию GetDC с аргументом Panel1.Handle.

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

Для вывода на компонент класса TImage можете записать:

Dc:= Image1.Canvas.Handle;

и удалить строки BeginPaint и EndPaint, поскольку TImage не имеет свойства Handle, то есть не создает отдельного окна. Однако вывод на такие компоненты как раз отличается полной неустойчивостью, так что я не гарантирую Вам надежного положительного результата.

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

Лекция 1 | Лекция 2

Размер, разрешение и форматы... Что происходит с пикселями? Вы покупаете камеру из-за количества мегапикселей? У вас есть проблемы с размещением фотографий в Интернете? Отличается ли печать ваших фотографий низким качеством, даже если они выглядит великолепно на экране? Кажется, есть некая путаница между пикселями и байтами (размер изображения и размер файла), качеством и количеством, размером и разрешением. В этом уроке мы разберем эту крайне важную для любого фотографа информацию

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

Это изображение размером 750 × 500 пикселей с разрешением 72 dpi, сохраненное формат сжатый JPG, который составляет 174kb. Давайте разберемся, что все это значит.

Разрешение и размер – это одно и то же?

Одно из самых больших недопониманий исходит из концепции разрешения. Если это ваш случай, поверьте мне, что вы не одиноки.

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

Вы, наверное, много слышали о пикселях, по крайней мере, когда покупали свою камеру. Это одна из самых понятных и «существенных» спецификаций на рынке, поэтому я начну с этого.

Что такое пиксель?

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

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

Количество пикселей

Первый вид разрешения относится к количеству пикселей, которые формируют вашу фотографию. Чтобы рассчитать это разрешение, вы просто используете ту же формулу, которую вы бы использовали для площади любого прямоугольника; умножьте длину на высоту. Например, если у вас есть фотография с 4500 пикселями на горизонтальной стороне и 3000 по вертикальной стороне, она дает вам 13 500 000. Поскольку это число очень непрактично, вы можете просто разделить его на миллион, чтобы преобразовать его в мегапиксели. Таким образом, 13 500 000/1 000 000 = 13,5 мегапикселей.

Плотность пикселей

Другое разрешение - это то, как вы распределяете имеющееся общее количество пикселей, что обычно называют плотностью пикселей.

Теперь разрешение выражается в dpi (или ppi), которое является аббревиатурой для точек (или пикселей) на дюйм, да именно на дюйм, так уж сложилось, что в метрическую систему это не перевели. Итак, если вы видите 72 dpi, это означает, что изображение будет иметь плотность 72 пикселя на дюйм; если вы видите 300 dpi – это 300 пикселей на дюйм и т. д.

Конечный размер вашего изображения зависит от выбранного вами разрешения. Если изображение имеет 4500 x 3000 пикселей, это означает, что он будет напечатан в размере 15 x 10 дюймов, если вы установите разрешение 300 dpi, но при 72 dpi оно будет 62,5 x 41,6 дюйма. Хотя размер печатного снимка меняется, вы не изменяете размер своей фотографии (файл изображения), вы просто меняете организацию существующих пикселей.

Представьте себе резиновую ленту, вы можете растянуть ее или сжать, но вы не меняете количество ленты, вы не добавляете и не разрезаете ее.

Таким образом, разрешение и размер – это не одно и то же, но они связаны между собой.

Так количество означает качество?

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

Однако, помимо количества, вы также должны учитывать глубину пикселей, это то, что определяет количество тональных значений, которое содержит ваше изображение. Другими словами, это количество цветов на пиксель. Например, 2-битная глубина может хранить только черный, белый и два оттенка серого, но более распространенное значение - 8 бит. Значения растут экспоненциально, например, с 8-битной фотографией (2 до 8 = 256), у вас будет 256 оттенков зеленого, 256 тонов синего и 256 тонов красного, что означает около 16 миллионов цветов.

Это уже больше того, что глаз может отличить, что означает, что 16-бит или 32-бит будут выглядеть для нас относительно одинаково. Конечно, это означает, что ваше изображение будет тяжелее, даже если размер одинаков, потому что в каждом пикселе содержится больше информации. Именно поэтому качество и количество не обязательно идентичны.

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

Как выбрать и контролировать размер изображения и размер файла?

Прежде всего, вам нужно определиться, какая максимальная плотность вам нужна. Если вы разместите свое изображение онлайн, вы сможете отлично справиться с разрешением всего 72 dpi, но это слишком мало для печати фотографии. Если вы собираетесь печатать, вам нужно от 300 до 350 dpi.

Конечно, мы говорим обобщенно, потому что каждый монитор и каждый принтер будут иметь немного другие разрешения. Например, если вы хотите распечатать фотографию до 8 × 10 дюймов, вам нужно, чтобы изображение имело 300 точек на дюйм x 8 "= 2400 пикселей и 300 точек на дюйм x 10" = 3000 пикселей (поэтому 2400 × 3000 для печати 8 × 10 при 300 dpi). Все, что больше, будет лишь занимать место на жестком диске.

Как изменить размер в Photoshop

Откройте меню Размера изображения и во всплывающем окне вам нужно пометить поле «resample». Если вы не активируете «resample», вы будете перераспределять пиксели, как я объяснила в начале статьи.

Вы также можете выбрать галочку «Пропорция», если вы хотите, чтобы параметры регулировались в соответствии с вашими изменениями. Таким образом, ширина изменяется при изменении высоты и наоборот.

8×10 дюймов при 300 ppi , это размер, необходимый для печати 8 × 10. Обратите внимание на размер пикселей 3000 x 2400.

750×500 пикселей при 72 ppi . Это веб-разрешение, и это точный размер всех изображений в этой статье. Размер в дюймах не имеет значения при публикации в Интернете - имеет значение только размер в пикселях.

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

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

Если вы не хотите потерять какую-либо информацию, вам необходимо сохранить несжатый формат. Наиболее распространенным является TIFF.

Если вы не возражаете потерять небольшую информацию и иметь более легкий файл, перейдите в JPEG и выберите, насколько маленьким он должен быть. Очевидно, чем меньше значение вы устанавливаете, тем больше информации вы потеряете. К счастью, у него есть кнопка предварительного просмотра, чтобы вы могли видеть влияние вашего сжатия.

JPG высокое качество.

JPG низкое качество. Обратите внимание, как он пикселизирован и разбит? Если вы выберете очень низкое качество, вы рискуете ухудшить изображение слишком сильно.

Заключение

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

JPEG, PNG, GIF - боже мой! Идеальный формат ищут годами, потому что мало кто понимает, как они работают.

Посмотрим алгоритмы сжатия изображений, чтобы знать - какой формат выбрать.

Правила хранения изображений в интернете. Какой формат выбрать, чтобы картинка не протухла? Перевод статьи от blog.sibirix.ru .

JPEG

Формат проверен временем. Как же он работает и для чего хорош?

JPEG сжимает изображения квадратами 8*8 пикселей, а затем делает что-то сумасшедшее и математическое. Преобразует пиксели в каждом блоке из RGB в YCbCr. С технической точки зрения, JPEG преобразует информацию из пространственной области в частотную.

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

Не подходит: для объектов с чёткими границами на изображении.

GIF

Формат GIF сжимает изображения с помощью алгоритма LZW. Он проще, чем магическая математика в JPEG. Алгоритм LZW сканирует изображение и генерирует короткие коды для повторяющихся частей, а потом сокращает их.

Ещё у GIF есть пара фич: прозрачность и поддержка анимации, но… Этот формат поддерживает только 256 цветов.

Подходит: для сжатия изображений с повторяющимися данными. Изображения с резкими переходами сохраняются без потерь.

Не подходит: для изображений с большим количеством цветов. Сжатие приводит к пастеризации.

Сильные стороны GIF и JPEG дополняют друг друга - они были убойной командой в эру молодого интернета. Но проблемы с патентом на LZW побудили к созданию новых форматов.

PNG

PNG как GIF, но лучше:

  • Нет ограничения на 256 цветов.
  • Есть поддержка альфа-канала (для создания частичной прозрачности).
  • Подходит практически во всех ситуациях.

Как работает PNG?

  1. Алгоритм сжатия PNG уменьшает объем данных. Он предполагает, что каждый следующий пиксель похож на предыдущий. Если это подтверждается - сохраняет разницу между предположением и фактическим значением. Маленькие числа занимают меньше места.
  2. Вырезает повторения с помощью алгоритма LZ77. Да-да, для GIF - LZW, а для PNG - LZ77. Не путаем! Так избегают проблем с патентом.
  3. Использует алгоритм кодирования Хаффмана. Генерирует короткие коды для распространенных значений.

PNG лучше, чем GIF (почти всегда). Хуже, чем JPEG - для фотографий.

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

Новое поколение

На момент написания статьи JPEG, GIF и PNG - единственные форматы с универсальной поддержкой. Только их разработчики могут реально использовать. Однако новые форматы уже здесь и достойны внимания.

WEBP

WebP - ответвление видеоформата Google WebM.

WebP использует одну из шестнадцати стратегий предсказания для каждого блока в изображении. Он без потерь сжимает разницу между предсказанным и фактическим значениями.

WEBP лучше, чем PNG или JPEG. Но этот формат поддерживается только в Chrome.

JPEG-XR

Формат следующего поколения, выбор Microsoft - JPEG-XR. Новые методы на основе механики сжатия JPEG. Но предлагает.