Преобразование BMP в JPEG с помощью JavaScript

Мне уже удается вручную создать растровое изображение загруженного изображения, манипулируя цветовыми каналами для получения 8-битного изображения. Теперь мне нужно преобразовать растровое изображение в jpeg, но мне нужно поддерживать разрядность (одноканальная глубина 8 бит) Я не могу использовать Canvas, так как после завершения преобразования результирующий файл имеет глубину 24 бита. Кто-нибудь знает, можно ли использовать JavaScript для этого преобразования, чтобы я мог все манипуляции с изображениями на стороне клиента?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 081
1

Ответы 1

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

Например, то, что мы называем PNG-24, на самом деле составляет 8 бит * 3 канала (RGB), а PNG-32 - 8 бит * 4 (RGBA).

Но, проще говоря, формат JPEG не поддерживает индексированные цвета, он всегда (по крайней мере) * TrueColor: 3 канала * 8 бит => ~ 16,77 миллиона цветов. *since v9 it actually supports up to 12 bits per channel

То, что вы хотите сделать (один 8-битный канал => 256 цветов), невозможно, потому что сам формат JPEG не поддерживает его.

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

Так что, если вам действительно нужно 8-битное изображение с одним каналом (256 цветов), посмотрите на форматы, которые поддерживают Индексированные цвета.
PNG является одним из них, но на самом деле холст вам здесь не поможет, так как Canvas API поддерживает только PNG-32 (8 бит на канал RGBA) .
GIF - это еще один, но я думаю, что только Safari поддерживает экспорт в GIF из элемента холста ...

Спасибо за ваш ответ. Из проведенного мной исследования я видел несколько примеров с использованием программ для проектирования, где можно создать файл JPEG с 8-битной глубиной. Например, если вы используете Photoshop, вы можете сохранить файл с 8-битной глубиной (одноканальный цвет). Мои требования к проекту - установить изображение в формате JPEG, оттенки серого с 256 цветами (глубина 8 бит). На данный момент я уже создал растровое изображение с одним цветовым каналом, но мне нужно преобразовать его в JPEG без потери битовой глубины, и я хотел бы сделать это на стороне клиента. Кто-нибудь может мне помочь?

Patricia Nascimento 18.09.2018 11:15

@PatriciaNascimento еще раз, сам формат jpeg не поддерживает 8-битный цветной один канал. Он старый, но параметр форумы.adobe.com/thread/376358, который у вас есть в PS, применяется только к изображению, которое у вас есть в ps (psd). После преобразования обратно в jpeg снова будет 24 truecolor.

Kaiido 18.09.2018 11:19

Возможно, я путаю концепции, но, глядя на пример видео, можно создать JPEG с 8-битной глубиной. ссылка Я попытался воспроизвести шаги, упомянутые в видео, и окончательное изображение было, как и ожидалось, в формате JPEG с глубиной 8 бит (одноканальный). Теперь я пытаюсь сделать то же самое, но с использованием Javscript.

Patricia Nascimento 18.09.2018 11:54

Нет, это видео-шоу должно перейти от (возможно, TIFF) 16 бит на канал до 8 бит на канал JPEG. Но есть еще 3 канала по 8 бит. Просто посмотрите, попробуйте сделать обратное, установите его на 16 бит на канал. Вы увидите, что PS не позволит вам сохранить его в формате JPEG, если вы не установите флажок «Сохранить как копию». Теперь проверьте сохраненный файл => сообщается как 8 бит.

Kaiido 18.09.2018 12:06

Хм ... Теперь я вижу, что в первом комментарии вы говорили об изображениях в оттенках серого? Это правда? В этом случае, может быть, действительно возможен единственный канал ... Но видео определенно этого не показывает.

Kaiido 18.09.2018 12:13

Да, это возможно с этими свойствами, но у меня проблемы с преобразованием в JPEG и сохранением битовой глубины.

Patricia Nascimento 18.09.2018 12:33

[! [введите здесь описание изображения] [1]] [1] [1]: i.stack.imgur.com/Ja2zh.jpg Сохраненный файл имел эти свойства. Это серое изображение в формате JPEG.

Patricia Nascimento 18.09.2018 12:55

Другие вопросы по теме