Архив автора: admin

Алгоритм топологической сортировки

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

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

Давайте разберемся с алгоритмом топологической сортировки на примере.

Алгоритм топологической сортировки

 

Шаг 1: мы вставляем те узлы, количество входящих ребер которых равно 0. Таким образом, эти узлы являются узлами 1 и 4.

Алгоритм топологической сортировки

 

Шаг 2:

а. Начнем с узла 1. Мы можем выбрать любой узел между узлами 1 и 4.

б. Мы уменьшаем каждое ребро узла на 1, которое связано с узлом 1. Мы уменьшаем ребро узлов (0, 2 и 3).

в. Мы перемещаем узел 1 из списка в топологически отсортированный список, как показано ниже.

Алгоритм топологической сортировки

 

Шаг 3:

а. Теперь мы исходим из списка, который является Node 4.

б. Мы уменьшаем все исходящие ребра узлов, соединенных с узлом 4, которые являются узлами (0 и 3).

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

Алгоритм топологической сортировки

 

Шаг 4:

а. Теперь мы исходим из списка, который является узлом 3.

б. Мы уменьшаем все исходящие ребра узлов, соединенных с узлом 3, которые являются узлами (0 и 2).

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

Алгоритм топологической сортировки

 

Шаг 5:

а. Теперь мы исходим из списка, который является Node 0.

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

Алгоритм топологической сортировки

 

Шаг 6:

а. Теперь мы исходим из списка, который является узлом 2.

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

Алгоритм топологической сортировки

 

Шаг 7:

Наконец, мы отсортировали список здесь.

Алгоритм топологической сортировки

 

Алгоритм топологической сортировки

Ниже приведены шаги алгоритма топологической сортировки, которым мы должны следовать.

Шаг 0: Рассчитайте степень вхождения каждого узла графа.

Шаг 1: Сначала нам нужно найти узел, у которого входящие ребра равны нулю.

Шаг 2: мы удаляем этот узел из графа и добавляем его в список топологических порядков сортировки.

Шаг 3: Удалите те узлы, у которых есть исходящие ребра.

Шаг 4: Уменьшите степень вхождения на количество связанных ребер, которые были удалены.

Шаг 5: Повторяйте шаги 1–4, пока не останется узлов с нулевой степенью вхождения.

Шаг 6: Убедитесь, что все элементы расположены в правильной последовательности.

Шаг 7: Теперь мы отсортировали заказ из шага 6.

Шаг 8: Положите конец алгоритму.

 

Код Python : ниже приведена реализация приведенного выше примера на Python.

 

fromcollectionsimportdefaultdict



classbuildGraph :



def__init__(self, nodes : int) :

self.nodes= nodes



# Теперь мы сохраняем граф в формате смежного списка

self.adjListDetails=defaultdict(list)



# Он будет хранить информацию о входящих

ребрах определенного узла 



# в самом

self.count_numbers_of_incoming_edge_of_a_node= []



# Мы сохраняем отсортированные узлы в топологическом порядке

self.topological_sorted_order= []



# Мы храним информацию обо всех тех узлах, которые

# не имеют входящих ребер в графе

self.nodes_have_zero_incoming_edges= []



# Теперь мы создаем смежный список всех графов для сортировки

defAddGraphEdge (self, source :int, destination : int) :

self.adjListDetails[source].append(destination)

self.count_numbers_of_incoming_edge_of_a_node[destination] +=1



defTopologicalSortAlgorithm (self) :



for node inrange(self.nodes) :

ifself.count_numbers_of_incoming_edge_of_a_node[node] ==0 :

self.nodes_have_zero_incoming_edges.append(node)



whileself.nodes_have_zero_incoming_edges :

self.nodes_have_zero_incoming_edges.sort()

            source =self.nodes_have_zero_incoming_edges.pop(0)



# итерация по соседнему списку

if source inself.adjListDetails :

for node inself.adjListDetails[source] :

self.count_numbers_of_incoming_edge_of_a_node[node] -=1

ifself.count_numbers_of_incoming_edge_of_a_node[node] ==0 :

self.nodes_have_zero_incoming_edges.append(node)



self.topological_sorted_order.append(source)



print("Топологический порядок сортировки: "+str(self.topological_sorted_order))



defmain() :



number_of_nodes=7

    graph =buildGraph(number_of_nodes)

graph.count_numbers_of_incoming_edge_of_a_node= [0] *number_of_nodes



graph.AddGraphEdge(0,2)

graph.AddGraphEdge(0,5)

graph.AddGraphEdge(1,3)

graph.AddGraphEdge(1,6)

graph.AddGraphEdge(2,4)

graph.AddGraphEdge(3,5)

graph.AddGraphEdge(5,2)

graph.AddGraphEdge(5,4)

graph.AddGraphEdge(6,2)



graph.TopologicalSortAlgorithm()



if __name__ =="__main__" :

main()

 

 

Выход:

Топологический порядок сортировки: [0, 1, 3, 5, 6, 2, 4]

 

Временная сложность алгоритма топологической сортировки:

Общее время обработки алгоритма равно O (E + N), где E представляет количество ребер, а N представляет количество узлов в графе. Затем, на следующем шаге, мы должны вычислить степень входа каждого узла, что обычно занимает O(E) раз, а затем поместить все эти узлы в отсортированный список, где их степень входа равна нулю, что занимает O(N) раз. раз. Таким образом, общая временная сложность алгоритма топологической сортировки составляет O (E+N).

Но пространственная сложность алгоритма топологической сортировки составляет O (N), что равно общему количеству узлов в графе.

 

Применение:

  1. Топологическая сортировка очень полезна для нахождения цикла графа.
  2. Алгоритм топологической сортировки используется для определения условий взаимоблокировки в операционной системе.
  3. Алгоритм топологической сортировки используется для поиска кратчайшего пути во взвешенном ациклическом графе.

 

Вывод :

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



2022-03-19T18:03:01
Программирование

Как выбрать кошелек для ERC-20 токенов

Кошельки для виртуальной валюты можно поделить на 5 разновидностей:

  • Интернет-кошельки. Это особый online-сервис, где можно разместить свою виртуальную валюту. В связи с тем, что подобное хранилище сберегает секретные шифры в режиме online, то его владельцы способны проще и оперативнее осуществлять транзакции. Это его главное достоинство. Вместе с тем их могут легко взломать злоумышленники. Это «MyEtherWallet», «MetaMask», «Scatter».
  • Локальные (настольные) хранилища виртуальных средств – это особое приложение, устанавливаемое на ПК. Они обладают серьезной степенью безопасности, т.к. сведения сохраняются прямо у пользователя на жестком диске. Есть 2 разновидности локальных хранилищ: «тонкий» и «толстый». В последнем случае требуется загрузить Blockchain, который постоянно станет обновляться, в связи с чем понадобится большой объем незанятого пространства. «Тонкое» денежное хранилище не нуждается в загрузке всей цепочки блоков. Вместе с тем по причине этого снижается его защищенность, поскольку кошелек станет считывать всю информацию с иных ресурсов. К десктопным кошелькам относятся: «Exodus», «Altcoin.io», «SimplEOS», «Greymass eos-voter».
  • Хардварные. Приспособления, предлагающие наиболее надежный способ размещения виртуальной валюты. В связи с тем, что приспособление схоже с «флешкой», его довольно комфортно эксплуатировать и всегда брать в дорогу. До использования хардварного денежного хранилища его следует присоединить к ПК. Подобный кошелек бережет секретные пароли не на слабозащищенных устройствах, функционирующее во всемирной паутине, а в защищенной среде денежного хранилища. При хищении средств, поломке либо утрате кошелька, его можно без труда восстановить посредством особого шифра, генерирующегося при установке денежного хранилища. Кроме того, данную разновидность кошельков можно просто и оперативно отрегулировать. Таким кошельком является «Ledger Nano S».
  • Виртуальное денежное хранилище для смартфонов. Особое приложение, инсталлирующееся на сотовый телефон. Весьма комфортно для повседневной эксплуатации, т.к. телефон всегда можно иметь под рукой и в случае необходимости осуществить требующуюся валютную операцию. У данной разновидности хранилищ криптовалюты средняя степень защищенности, поскольку программа применяет посторонние дистанционные хранилища данных. Мобильным кошельком является «Infinito Wallet».
  • Бумажные хранилища виртуальной валюты. Они представляют собой бумагу, на которой находятся дубликаты открытых и закрытых паролей. На особом портале создается адрес виртуальных денежных средств и генерируется изображение, обладающее 2-мя QR-шифрами. Посредством одного есть возможность получать электронные деньги, а другой представляет собой секретный пароль, необходимый для перечисления криптовалюты. Поскольку подобный кошелек не подключен к всемирной паутине и данные не находятся на ПК, то троянские программы или хакеры не могут до них добраться. Вместе с тем подобную бумагу следует защищать от повреждений (влаги, огня и др.). Его могут выкрасть не компьютерные, а обыкновенные воры.

Читать

Intel начинает инвестировать 80 миллиардов евро в ЕС с созданием полупроводникового мегасайта в Германии

Intel подтвердила планы по строительству производственной «мега-площадки» в Магдебурге, Германия, стоимостью 17 миллиардов евро.

Это объявление является частью планов Intel по обеспечению гораздо большего присутствия на континенте, при этом чиповый гигант инвестирует 80 миллиардов евро в Европу в течение следующего десятилетия. Эта новость появилась всего через несколько месяцев после того, как Intel объявила об открытии еще одного мегасайта стоимостью 20 миллиардов долларов в штате Огайо , США.

Первый этап включает в себя два передовых завода по производству полупроводников в Магдебурге, планирование которых начнется немедленно, а строительство, как ожидается, начнется в первой половине 2023 года. Хотя ожидается, что заводы не будут введены в эксплуатацию до 2027 года, они будут использовать транзисторные технологии Intel эпохи Angstrom. и стремиться обслуживать ряд литейных клиентов в дополнение к собственным процессорам Intel.

Предполагается, что в ходе строительства на площадке, именуемой «Silicon Junction», будет создано 7000 рабочих мест в сфере строительства, 3000 постоянных рабочих мест в Intel и десятки тысяч дополнительных рабочих мест у поставщиков и партнеров.

Помимо Германии, планы Intel в ЕС также включают новый центр исследований и разработок на плато-де-Сакле, Франция. Intel цитирует Францию ​​как свою «европейскую штаб-квартиру высокопроизводительных вычислений и искусственного интеллекта», и в течение следующих двух лет на сайте будет создано 450 вакансий.

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

Пэт Гелсингер, генеральный директор Intel, сказал: «Наши запланированные инвестиции — важный шаг как для Intel, так и для Европы. Закон ЕС о чипах даст возможность частным компаниям и правительствам работать вместе, чтобы радикально улучшить позиции Европы в полупроводниковом секторе».

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

В рамках амбициозного «цифрового десятилетия» блока Европа планирует к 2030 году обеспечить 20% мирового производства полупроводников. Приверженность Intel будет рассматриваться как важный шаг на пути к этой цели.



2022-03-17T21:05:49
Бизнес

Как восстановить программное обеспечение стиральной машины

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

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

Сложность программирования блока управления стиральной машиной

Некоторые модели бюджетных стиральных машин можно без особых усилий перепрошить даже самостоятельно. Достаточно купить специальный шлейф для соединения разъёма в машинке и ноутбука. Скачать специальную программу и перепрограммировать устройство. Некоторые производители бытовой техники например Бош и Сименс не выкладывают в свободном доступе свое программное обеспечение. Это считается интеллектуальной собственностью фирмы и имеется только авторизованных сервисных центрах. Так что при ситуациях, когда программа «слетела», придётся обращаться только к официальным представителям данной фирмы вашем регионе. Если вам нужен ремонт стиральной машины в Нахабино — обращайтесь в эту фирму.

Причины по которым ломается блок управления в стиральной машине

  • Самый опасный враг для электроники, это перепад напряжения. Любой скачок напряжения может запросто вывести весь блок управления из строя. А в лучшем стирается только программное запоминающее устройство, которое можно перепрограммировать.
  • Также попадания воды на электронные компоненты может спровоцировать такие неисправности, как выгорание элементов схемы на блоке управления.

 

Цены

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



2022-03-14T22:02:30
Программное обеспечение

Python. NumPy pad()

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

 

Определение NumPy и его синтаксис

Как мы все знаем, NumPy — это мощный математический пакет Python. Он включает в себя функцию под названием NumPy pad(), которая добавляет отступы к массивам. По мере продвижения по тексту определение, которое мы только что обсуждали, станет более ясным. Синтаксис, относящийся к этой функции, будет рассмотрен в прилагаемом разделе.

# numpy.pad(array, pad_width, mode='')

 

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

«mode» — это параметр. Он может представлять собой одно из приведенных ниже строковых значений или предоставленную пользователем функцию.

  • constant: при использовании этой опции заполнение выполняется с постоянным значением.
  • edge: в этой ситуации заполнение выполняется значением края массива.
  • maximum: когда выбран этот параметр, заполнение рассчитывается путем сложения наибольшего значения всех частей вектора вдоль указанной оси.
  • mean: заполнение в этой ситуации использует среднее значение всех секций вектора вдоль указанной оси.
  • median: когда выбран этот параметр, заполнение использует наибольшее значение из всех частей вектора вдоль предоставленной оси.
  • reflect: в этом случае вектор дополняется путем отражения его между начальным и последним значениями по каждой оси.

‘maximum,” mean,”median,’ и ‘minimum’ используют аргумент длины «stat». Статистическое значение рассчитывается с использованием количества значений на краю каждой оси.

В «constant» используется параметр «constant values». Значения используются для заполнения значений для каждой оси здесь.

 

Пример 1:

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

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

В этом примере мы выбрали «maximum» в качестве нашего режима. В результате передняя и задняя части дополняются максимум до 32 (максимальное значение). Ниже приведена реализация, как вы можете видеть.

import numpy as ppool

abc=[2,32,7,8]

print(ppool.pad(abc,(2,3),"maximum"))

 

Вот результат, где вы можете увидеть максимальное значение в начале и в конце массива.

[32 32 2 32 7 8 32 32 32]

 

Пример 2:

Давайте посмотрим на другой пример, используя другой режим. Вторая иллюстрация, похожая на первую. Однако в данном случае мы использовали другой массив. Кроме того, мы выбрали «reflect» в качестве режима наблюдения. Можно увидеть изменение выхода.

import numpy as p

abc=[12,33,22,37,60,80,2]

print(p.pad(abc,(5,1),"reflect"))

 

Вот результирующий экран приведенного выше кода.

[80 60 37 22 33 12 33 22 37 60 80 2 80]

 

Пример 3:

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

Опция режима определяет тип значения, которое будет использоваться для заполнения массива. Мы используем постоянные значения 1 и 5 для заполнения массива в нашем коде, но мы можем изменить этот режим на медианный, средний, пустой, перенос и т. д. Каждый режим добавляет новый элемент в массив, чтобы дополнить его.

import numpy as p

one = [2,4,6,8]

two = p.pad(one,(3, 2), mode =  'constant', constant_values = (1, 5))

print(two)

 

Ниже приведен экран вывода для вашей помощи.

[1 1 1 2 4 6 8 5 5]

 

Пример 4:

В этом случае мы импортировали NumPy с псевдонимом «pp» в приведенном выше коде. Используя вектор, ширину площадки, ось и kwargs, мы разработали метод pad. Чтобы получить значения заполнения из предоставленной функции get(), мы объявили значение переменной padding.

Значения заполнения были предоставлены части вектора.

Мы использовали функцию np.arange() для построения массива «one» и функцию reshape() для изменения его формы. Результирующее значение функции np.pad() было присвоено переменной ‘two’. Функция предоставила список «один» и параметр ширины pad. Наконец, мы попытались напечатать значение «two».

import numpy as pp

def pad_with(vector, pad width, iaxis, kwargs):

         padding_val = kwargs.get('padder', 5)

         vector[:pad_width[0]] = padding_val

         vector[-pad_width[1]:] = padding_val

one = pp. arange(6)

one = one.reshape((3, 2))

two = pp. pad(one, 2, pad_with)

print(two)


Результирующий экран показывает ndarray, дополненный определенным размером и значениями в выходных данных.

[[5 5 5 5 5 5]

 [5 5 5 5 5 5]

 [5 5 0 1 5 5]

 [5 5 2 3 5 5]

 [5 5 4 5 5 5]

 [5 5 5 5 5 5]

 [5 5 5 5 5 5]]

 

Заключение

Pad() — очень важная функция для специфического кодирования, она стала часто используемой функцией в Python. Функция позволяет изменять массив, чтобы ограничить количество конфликтов системы памяти. Функция numpy.pad() широко используется для полной функциональности AST. Эта функция, в частности, позволяет пользователю указать новый размер или даже позволить системе автоматически рассчитать размер для них.

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



2022-03-12T15:06:48
Python

Сжатие изображений: пресеты WebP, HEIC, AVIF, JPEG XL

Как время летит. Восемь лет назад я написал сообщение в блоге об эксперименте с изображениями WebP на веб-сайте End Point, чтобы описать и продемонстрировать, как формат изображения WebP может хранить изображение эквивалентного качества в гораздо меньшем размере файла, чем старые форматы JPEG, PNG и GIF.

Основным недостатком в то время было то, что среди основных браузеров только Chrome и Opera поддерживали WebP, а тогда Chrome был гораздо менее популярен, чем сейчас.

 

Могу ли я использовать его?

Поскольку iOS 14 и macOS 11 (Big Sur) от Apple стали доступны в конце 2020 года, формат изображений WebP теперь работает во всех поддерживаемых в настоящее время основных операционных системах и браузерах: Linux, Windows и macOS, работающих под управлением Chromium, Chrome, Brave, Edge, Opera, Firefox, и Safari.

Прошло всего около 10 лет! 😁

Таким образом, для вас, кто размещает веб-сайты, все посетители вашего сайта могут видеть изображения и анимацию WebP, за исключением тех, кто исчезает с помощью Internet Explorer (теперь его поддержка Microsoft давно закончилась и его использование опасно), и люди (или их организации), которые преднамеренно не разрешать обновлять свои старые браузеры и операционные системы.

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

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

 

Как создавать изображения WebP?

Мобильные телефоны и цифровые камеры обычно сохраняют изображения в формате JPEG, HEIF или необработанные (несжатые) изображения. Некоторые коллекции стоковых фотографий можно загрузить через WebP, но многие по-прежнему используют JPEG.

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

GIMP (программа обработки изображений GNU) поддерживает изображения WebP примерно с 2017 года, а Adobe Photoshop изначально не поддерживает, но может использовать бесплатный плагин WebPShop.

Самый старый способ преобразования изображений в WebP, который до сих пор очень полезен для пакетной обработки или тонкой настройки, — это конвертер WebP от Google «cwebp».

 

Настройки cwebp

С мощными предложениями «cwebp» связаны некоторые сложности, но в основном они безвредны.

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

cwebp -longhelp


 

Или прочтите то же самое в его онлайн-документации.

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

В документации также показаны полезные функции -presetи -hintпараметры сжатия с потерями, аналогичные тому, что делает JPEG, но лучше:

-preset <string> ....... preset setting, one of:

                          default, photo, picture,

                          drawing, icon, text



-hint <string> ......... specify image characteristics hint,

                         one of: photo, picture or graph


 

Значение некоторых из этих терминов, особенно «фото» и «изображение», было для меня неясным и не определялось нигде в документации, которую я мог видеть.

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

Комментарии к варианту -preset:

WEBP_PRESET_PICTURE,  // digital picture, like portrait, inner shot

WEBP_PRESET_PHOTO,    // outdoor photograph, with natural lighting

WEBP_PRESET_DRAWING,  // hand or line drawing, with high-contrast details

WEBP_PRESET_ICON,     // small-sized colorful images

WEBP_PRESET_TEXT      // text-like


 

И комментарии к варианту -hint:

WEBP_HINT_PICTURE,    // digital picture, like portrait, inner shot

WEBP_HINT_PHOTO,      // outdoor photograph, with natural lighting

WEBP_HINT_GRAPH,      // Discrete tone image (graph, map-tile etc).


 

Короче говоря, «cwebp» считает «изображение» в помещении и крупным планом, а «фото» — на улице и, скорее всего, с более дальним фокусом. Это хорошо знать.

 

Пакетное преобразование

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

Простой bashскрипт хорошо работает для обработки множества изображений подряд:

for infile in Screenshot*.png

do

    echo $infile

    base=$(basename "$infile" .png)

    cwebp -preset picture -v "$infile" -o "$base".webp

done


 

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

Мои скриншоты при преобразовании из PNG в WebP постоянно занимают около 3% исходного пространства, в 33–35 раз меньше! И качество примерно такое же. Удивительно.

 

Конкуренты WebP

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

 

HEIC

Подмножество HEIC (High-Efficiency Image Container) стандарта HEIF (High Efficiency Image File Format) использует высокоэффективное кодирование видео (HEVC, H.265) для хранения изображений с суффиксом .heic.

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

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

HEIC используется в операционных системах Apple с момента выпуска в 2017 году iPhone 7, iOS 11 и macOS 10.13 (High Sierra). Позднее поддержка была добавлена ​​в Windows 10, Android 9 и Ubuntu 20.04.

На момент написания этой статьи ни один из основных браузеров изначально не поддерживал HEIC , даже собственный Safari от Apple.

Так что на данный момент HEIC в основном используется Apple для более эффективного хранения фотографий на своих мобильных устройствах.

 

AVIF

AVIF (формат файла изображения AV1) конкурирует с HEIC и, что сбивает с толку, использует тот же формат файла контейнера HEIF, что и HEIC. Эта путаница на практике уменьшается за счет использования отдельного расширения файла..avif.

AVIF поддерживается в текущих версиях Chrome, Firefox и Opera. Поддержка была добавлена ​​в WebKit в 2021 году, но до сих пор не появилась в Safari. Он также работает в новых версиях VLC, GIMP, Windows, Android и т. д.

У Netflix есть очень подробный пост в блоге , в котором сравниваются AVIF и JPEG и демонстрируются многочисленные преимущества AVIF.

 

JPEG XL

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

Принимая во внимание, что другие новые форматы изображений, упомянутые выше, обычно теряют некоторое качество при повторном сжатии JPEG и других изображений, которые уже были сжаты с потерями, согласно Объединенной группе экспертов по фотографии (JPEG) :

Существующие файлы JPEG можно без потерь перекодировать в JPEG XL, значительно уменьшив их размер.

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

Это, конечно, означает, что на данный момент ни один из основных браузеров изначально не поддерживает JPEG XL.

 

Используйте WebP прямо сейчас

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

Наши разработчики настроили на сервере автоматическое преобразование высококачественных PNG-оригиналов в WebP или JPEG на стороне приложения на лету, при этом размер изображения зависит от размера области просмотра браузера. И мы работали с Cloudinary, Cloudflare и другими CDN, чтобы использовать их услуги преобразования изображений. Мы также готовы помочь с вашими проектами.



2022-03-10T22:51:04
Программное обеспечение