Russian Qt Forum
Март 28, 2024, 14:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Картиночки  (Прочитано 17843 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« : Декабрь 11, 2016, 22:33 »

Какое-то время я работал над библиотечкой, которая могла бы заменить текущие имаджформаты в Qt (да, они не совершенны).
Что-то получилось:) Прежде, чем выдавать на суд кутешникам, спрошу мнения здесь - понятно ли, что вообще за зверь, зачем это надо.
Возможно, будут какие-то предложения.

Документация
Сорцы
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Декабрь 12, 2016, 14:12 »

Думается о "замене текущих форматов" лучше умолчать, а упирать на dds. Напр назвать это хозяйство "dds format support". А dds уже  может содержать много чего (мипы, фреймы и др). И "problematic" если не убрать то засунуть в конец

Если же планы шире (мол, dds только частный случай) - то нужны доп пояснения, напр какие приложения смогут прочесть записанное
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #2 : Декабрь 12, 2016, 17:08 »

Думается о "замене текущих форматов" лучше умолчать, а упирать на dds.

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

Если же планы шире (мол, dds только частный случай) - то нужны доп пояснения, напр какие приложения смогут прочесть записанное

В целом, добавить примеров можно.
К сожалению, я не близок к миру 3д графики, поэтому не очень в курсе, как используется тот же DDS и какие задачи с ним на практике (ну кроме зафигачить файл целиком на видюху, это не к плагинам)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Декабрь 13, 2016, 00:10 »

Как видится,

Код:
Optional<ImageContents> maybeContents = reader.read();
if (!maybeContents) {
        qWarning() << "Error reading image:" << reader.error().errorString();
        return 1;
    }
ImageContents contents = *maybeContents;

тут Optional<> - избыточная конструкция. Я бы предпочел такое:

Код:
ImageContents contents = reader.read();
if (!contents.isValid()) {
        qWarning() << "Error reading image:" << reader.error().errorString();
        return 1;
    }

Абсолютно неочевиден смысл операции *maybeContents, да она по сути и не нужна.
« Последнее редактирование: Декабрь 13, 2016, 00:12 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Декабрь 13, 2016, 06:29 »

Абсолютно неочевиден смысл операции *maybeContents ...
Согласен полностью
Записан

Юра.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #5 : Декабрь 13, 2016, 10:41 »

Абсолютно неочевиден смысл операции *maybeContents, да она по сути и не нужна.

Сейчас есть такая бага:
Код:
QImageReader reader("empty.png");
auto image = reader.read();
if (image.isNull()) {
    qWarning() << reader.errorString(); // ooops there was no error, image is really null
}

Возможно, лучше передавать по результат по ссылке, а возвращать error код.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #6 : Декабрь 13, 2016, 11:20 »

Еще можно возвращать std::pair<ImageIOError, ImageContents>, как делает std::map::insert.
Дело в том, что в 17х плюсах обещают python-like возврат множественых значений из ф-ии (путем возврата std::pair/std::tuple и их автоматического разворачивания).
Тогда юзание будет какое-то такое:

Код:
ImageIo reader("file.png");
auto [ok, contents] = reader.read();
if (!ok) {
    qWarning() << ok.errorString();
}
/// ...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 13, 2016, 17:42 »

Ну так-то все понимают, что текущие имадж форматы не очень
Ну как "не очень" - необходимость просто загрузить одну картинку (без затей) всегда была и будет.
(например, нельзя записать gif, ico, icns, это ограничение API).
Вот на это и напирайте, мол multiply images support и все такое. И список этих новых поддержек ставьте первым

К сожалению, я не близок к миру 3д графики, поэтому не очень в курсе, как используется тот же DDS и какие задачи с ним на практике (ну кроме зафигачить файл целиком на видюху, это не к плагинам)
Я впервые услышал о dds. Вообще 3D и OpenGL - очень разные вещи/запросы. Volume Texture - это чисто дела OpenGL, и, насколько мне известно, успехи с ней невелики т.к. сделано явно тупо - гигантский объем, ноль интеллекта. Гораздо интереснее/перспективнее форматы воксельной графики.

Карты отражения/окружения широко используются везде, вариаций много. Напр есть еще angular (круг), fish, skyDome и др. Шесть имеджей - ну это уже все больше "дань истории", еще лет 5 назад меня попросили конвертировать их в cross (не те времена чтобы экономить % имеджа). Нельзя сказать что какой-то формат заметно лучше, напр многие юзают старый добрый spherical.

Мипы - ну тоже дела OpenGL. Мульти-фреймы - таких форматов мало, гораздо чаще используют просто "набор файлов" (с именами типа file00000.jpg, file00001.jpg, file00002.jpg, и.т.д) или же мувик

Особняком стоят форматы с большей точностью или большим диапазоном. Популярен .exr, да и хотя бы 2 байта на канал (ushort) - дело нужное

В общем все как-то приспособились.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #8 : Декабрь 13, 2016, 18:51 »

Ну как "не очень" - необходимость просто загрузить одну картинку (без затей) всегда была и будет.
Да, но не делать же отдельное АПИ на каждый тип картинок, их количество весьма ограничено.
У меня только psd не поддерживаются, потому что яхз, что там у "ей внутре".

Вот на это и напирайте, мол multiply images support и все такое. И список этих новых поддержек ставьте первым
Ок

Я впервые услышал о dds. Вообще 3D и OpenGL - очень разные вещи/запросы. Volume Texture - это чисто дела OpenGL, и, насколько мне известно, успехи с ней невелики т.к. сделано явно тупо - гигантский объем, ноль интеллекта. Гораздо интереснее/перспективнее форматы воксельной графики.
Ну основной юзкейз dds - это плоские 2д текстуры. Современные видюхи умеют работать напрямую с DDS. Например, в Cтаркрафте все текстуры хранятся в dds.

Мипы - ну тоже дела OpenGL. Мульти-фреймы - таких форматов мало, гораздо чаще используют просто "набор файлов" (с именами типа file00000.jpg, file00001.jpg, file00002.jpg, и.т.д) или же мувик
А как же иконки?Улыбающийся

Особняком стоят форматы с большей точностью или большим диапазоном. Популярен .exr, да и хотя бы 2 байта на канал (ushort) - дело нужное
Как я уже упоминал, это просто еще один формат для QImage, никакого нового АПИ тут не нужно.
Таких форматов туда можно много напихать (в том же dds их около сотни (!) поддерживается)
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #9 : Декабрь 13, 2016, 22:43 »

Меня интересуют некоторые операции которые технически я не знаю как реализовать с пом. Qt , это:
- создание файлов *.ico; (требуется для windows приложений)
- установка прозрачного фона для картинок (постоянно требуется для создания пиктограмм приложений).
Скажите с пом. "Картиночек" это можно будет реализовать?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 14, 2016, 11:55 »

У меня только psd не поддерживаются, потому что яхз, что там у "ей внутре".
Там своя песня, упор на "слои" которые могут всяко-разно комбинироваться, часто с помощью масок. 

А как же иконки?Улыбающийся
Трехмерщику такая мелочь неинтересна, если там пикселей с гулькин нос - ничего путного не отрендерить

Как я уже упоминал, это просто еще один формат для QImage, никакого нового АПИ тут не нужно.
Таких форматов туда можно много напихать (в том же dds их около сотни (!) поддерживается)
Не думаю что все так просто, во всяком случае эти форматы имеют свои специфичные данные. И неясно как "трактовать" содержимое имеджа (bits()). Если в родных данных то как рисовать, иначе родные надо где-то еще хранить.

Пример: популярная задача "terranizer". Юзер мазюкает чего-то (напр в фотошопе) и отдает картинку плагину который по ней строит "горы", где цвет белее - гора выше, темнее - ниже. Казалось бы, все просто и даже примитивно. И тут выясняется что 256 значений высоты - это очень мало, горы получаются явно "ступеньками". Фотошоп сможет делать бОльший диапазон, но читать-то это нечем. Поэтому "2-bytes textures support" - реальная, крутая фича
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #11 : Декабрь 14, 2016, 13:15 »

- создание файлов *.ico; (требуется для windows приложений)

Да, это один из основных юзкейзов.

- установка прозрачного фона для картинок (постоянно требуется для создания пиктограмм приложений).
На чтении или записи? На чтении сейчас можно сделать QImageReader::setBackgroundColor
На запись - как картинку запишите, так и будет.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #12 : Декабрь 14, 2016, 14:43 »

Абсолютно неочевиден смысл операции *maybeContents, да она по сути и не нужна.

Сейчас есть такая бага:
Код:
QImageReader reader("empty.png");
auto image = reader.read();
if (image.isNull()) {
    qWarning() << reader.errorString(); // ooops there was no error, image is really null
}

Возможно, лучше передавать по результат по ссылке, а возвращать error код.

Не вижу бага тут, ну пустая картинка и пустая.
Уберите Optional вообще, а в ImageContents добавьте что-то вроде isValid().
А еще что  то типа ImageContents::toImage() например.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #13 : Декабрь 14, 2016, 15:06 »


Не вижу бага тут, ну пустая картинка и пустая.
Уберите Optional вообще, а в ImageContents добавьте что-то вроде isValid().
А еще что  то типа ImageContents::toImage() например.


Пустая картинка возвращается в двух случаях - либо была ошибка, либо файл содержит пустую картинку. Как вы эти 2 случаях собираетесь различать?
Насчёт isValid(). Разделение QString::isEmpty/QString::isNull считается ошибочным и в Qt6 его уберут.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Декабрь 14, 2016, 15:07 »

Exception же!
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 23.