LINUX.ORG.RU

Simple Viewer GL - вьювер изображений

 , ,


2

1

Когда-то давно я не смог найти для себя вьювер, который удовлетворял моим требованиям. Посему был написан свой вьювер - simple viewer, базирующийся на GFL SDK (используется в xnview).

Через некоторое время я решил отказаться от GFL SDK в пользу открытых библиотек (libjpeg, libtiff, giflib, libpng, etc.) и перешел на OpenGL. Так 8 лет назад родился Simple Viewer GL: https://bitbucket.org/andreyu/simple-viewer-gl

Картинка для привлечения внимания: https://bitbucket.org/repo/XgobE8/images/1203610096-simpleviewergl.png

Поддерживается все, что умеет ImLib2 (BMP, TARGA, куча прочих форматов), а так же:

  • PNG (libpng),
  • JPEG (libjpeg),
  • TIFF (libtiff),
  • GIF (giflib),
  • PPM (частичная поддержка),
  • DDS (частично),
  • PSD (формат до конца не отреверсили, посему не все фичи поддерживаются),
  • ICO (png и «обычные» фреймы),
  • XWD (только x11, за реализацию x10 даже не брался),
  • SCR (ZX-Spectrum screen),
  • PVR, RAW, AGE (это внутренние форматы).

Интерфейс - одно окно с опциональной строкой статуса и информацией о пикселе/селекшене под курсором.
Вьювер умеет определять тип файла по его сигнатуре, а не только по расширению.
Умеет рекурсивно сканировать директорию.

Работает под Linux и macOS. Вместо мертвого freeglut используется glfw3.

Сегодня собрался с силами и смержился с development.
Постараюсь ответить на все ваши вопросы по вьюверу.

Перемещено beastie из talks

★★★★★

Последнее исправление: andreyu (всего исправлений: 1)

Какой giflib нужен? А то вон что с 5.1.4:

/home/mike/simple-viewer-gl/src/formats/formatgif.cpp:49:64: ошибка: too few arguments to function «GifFileType* DGifOpenFileName(const char*, int*)»
GifFileType* gif_file = DGifOpenFileName(m_filename.c_str());
^
In file included from /home/mike/simple-viewer-gl/src/formats/formatgif.cpp:16:0:
/usr/include/gif_lib.h:179:14: замечание: declared here
GifFileType *DGifOpenFileName(const char *GifFileName, int *Error);
^
/home/mike/simple-viewer-gl/src/formats/formatgif.cpp:60:31: ошибка: too few arguments to function «int DGifCloseFile(GifFileType*, int*)»
DGifCloseFile(gif_file);
^
In file included from /home/mike/simple-viewer-gl/src/formats/formatgif.cpp:16:0:
/usr/include/gif_lib.h:183:9: замечание: declared here
int DGifCloseFile(GifFileType * GifFile, int *ErrorCode);
^
/home/mike/simple-viewer-gl/src/formats/formatgif.cpp:165:27: ошибка: too few arguments to function «int DGifCloseFile(GifFileType*, int*)»
DGifCloseFile(gif_file);

imul ★★★★★
()
float CSelection::getTime()
{
    SystemTime now;
    ::gettimeofday(&now, 0);

    const unsigned delta = (unsigned)((now.tv_sec - m_timeLast.tv_sec) * 1000000 + (now.tv_usec - m_timeLast.tv_usec));

    m_timeLast = now;

    return delta * 0.000001f;
}

Вот это крутанул :D

fornlr ★★★★★
()

PVR

Ты про дримкастовский аналог DDS для тамошнего PowerVR? Но нахера, если консоль уже 14 лет как энд оф лайф?

svr4
()
Последнее исправление: svr4 (всего исправлений: 1)

SVG не открывает, обидно

чем не удовлетворял? (хотя 8 лет назад могло и не быть стоящих вьюеров, да)

он же сортит по имени файла, когда открывает директорию? Было бы хорошо, чтобы он умел ещё как-то(я почти везде юзаю сорт по времени изменения)

о, еще как-то странно уменьшает. Я сделал s — стало 7%. Затем я сделал -, стало 25%. Он не умеет меньше 25% уменьшать?

f1u77y ★★★★
()
Последнее исправление: f1u77y (всего исправлений: 2)
Ответ на: комментарий от f1u77y

Да так и сделал уже. Но, спросить всё-равно надо.

imul ★★★★★
()
Ответ на: комментарий от Harald

чем оно лучше gwenview?

Легковесностью, поддержкой нужных мне форматов, умением отображать информацию о пикселе и выделенной области.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от imul

Какой giflib нужен? А то вон что с 5.1.4:

Я пользуюсь giflib stable 4.2.3. Кто-то мне писал о подобном баге, тогда мы решили этот вопрос простым патчем.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от fornlr

Вот это крутанул :D

Ага, какая-то старая затычка.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от svr4

Ты про дримкастовский аналог DDS для тамошнего PowerVR? Но нахера, если консоль уже 14 лет как энд оф лайф?

Нет, не про него. Это один из внутренних форматов.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

1) Почему битбакет?

Потому, что мне он нравится.

2) Почему не Qt?

Стесняюсь спросить, а на хрена он во вьювере?

andreyu ★★★★★
() автор топика
Ответ на: комментарий от f1u77y

SVG не открывает, обидно

Это векторный и слишком сложный для рендеринга формат.

чем не удовлетворял? (хотя 8 лет назад могло и не быть стоящих вьюеров, да)

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

он же сортит по имени файла, когда открывает директорию?

Да, по имени без учета кейса.

Было бы хорошо, чтобы он умел ещё как-то(я почти везде юзаю сорт по времени изменения)

Пожалуй можно внести такую сортировку в todo.

о, еще как-то странно уменьшает. Я сделал s — стало 7%. Затем я сделал -, стало 25%. Он не умеет меньше 25% уменьшать?

Меньше можно получить только с «вписав» изображение в размер окна. Зумом меньше 25% не сделать. Мне не было нужно, потому над этим даже и не задумывался.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

2) Как минимум:

  • можно использовать системный шрифт, а не вшитый
  • нормальный парсер cli, а не велосипед
  • изкоробочная поддержка большей части перечисленных форматов изображений
  • QSettings, который сам умеет находить пути к конфигам, а не свой велосипед
  • изкоробочный file dialog, а не велосипед
  • готовые vector2d и rect, а не велосипед
  • нативный внешний вид

В общем нехило бы сократило код, дало беспроблемную работу и сборку на трёх основных ОС (ака поддержку винды, которой у вас нет).

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

можно использовать системный шрифт, а не вшитый

Это как претензия к игре - у нее «вшитый» шрифт, а не системный.

нормальный парсер cli, а не велосипед

А чем мой велосипед хуже?

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

Там не используются giflib, libpng, libjpeg, etc? Там есть поддержка форматов, которые нужны мне?

QSettings, который сам умеет находить пути к конфигам, а не свой велосипед

Мой велосипед - это полторы с половиной строки, а вы предлагаете мне втянуть для этого Qt? Простите, но я не наркоман.

изкоробочный file dialog, а не велосипед

А так вы не видели вьювер, а мнение составили на основе ...на основе чего?
У меня нет file dialog.

готовые vector2d и rect, а не велосипед

struct vector { float x, y; };
struct rect { float x1, y1, x2, y2; };

Вы ради этого предлагаете тянуть Qt? Завязайте с веществами.

нативный внешний вид

У моего вьювере вполне нативный для GL приложения вид. Мне не нужны ни свистоперделки, ни кнопочки с закорючками.

Те, кому нужен вьювер на qt, qtvector, qtrect, file dialog и прочее, тот может взять любой вьювер на Qt.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

В общем нехило бы сократило код,

И увеличило бы рантам. Это, пожалуй не для меня.

дало беспроблемную работу

Как это связано с Qt?

и сборку на трёх основных ОС (ака поддержку винды, которой у вас нет).

Вьювер работает на linux и macos. А windows меня не интересует. Да и там уже лет 20 как есть хороший вьювер - irfanviewer.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Это как претензия к игре

Это не игра.

А чем мой велосипед хуже?

Тем, что велосипед.

Там есть поддержка форматов, которые нужны мне?

Большинства - есть. Остальные можно легко подключить.

Вы ради этого предлагаете тянуть Qt? Завязайте с веществами.

Сэкономили бы 250 строк.

У меня нет file dialog.

Я про это: https://bitbucket.org/andreyu/simple-viewer-gl/src/fcc9db9165d11c40fbdeca854d...

У моего вьювере вполне нативный для GL приложения вид.

Нормальный у gwenview, и он тоже умеет GL.

тот может взять любой вьювер на Qt.

В чём тогда смысл вашего проекта?

И увеличило бы рантам.

Вы и так подключаете 100500 либ + шрифт весов в 1мб. Тем более на лине это не проблема.

RazrFalcon ★★★★★
()

Ничего личного, но терпеть не могу вашего брата игродела. Вообще какие-то товарищи не от мира сего, то все пути захардкодят, то OpenGL подавай, то Droid Sans зачем-то заэмбеддят o_O

d_a ★★★★★
()
Ответ на: комментарий от RazrFalcon

Это не игра.

И?

Тем, что велосипед.

Допускаю, что в ваших краях это весомый аргумент.

Большинства - есть. Остальные можно легко подключить.

Спасибо, Кэп.

Сэкономили бы 250 строк.

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

Я про это: https://bitbucket.org/andreyu/simple-viewer-gl/src/fcc9db9165d11c40fbdeca854d...

Так где, говорите, там file dialog?

Нормальный у gwenview, и он тоже умеет GL.

А я запретил вам его использовать?

В чём тогда смысл вашего проекта?

Читайте по губам - он делает ровно то, что нужно мне. Другие этого не умеют или делают не так как нужно мне.

Вы и так подключаете 100500 либ + шрифт весов в 1мб. Тем более на лине это не проблема.

Ваша математика, как и в случае с количеством сэкономленных строк, весьма слаба.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от d_a

Ничего личного, но терпеть не могу вашего брата игродела.

Всем люб не будешь.

Вообще какие-то товарищи не от мира сего, то все пути захардкодят,

Какие?

то OpenGL подавай,

Куда же без него?

то Droid Sans зачем-то заэмбеддят o_O

На вкус и цвет все фломастеры разные. Но вы, при желании, можете использовать свой любимый фонт.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от thunar

Анимации в gif умеет?

Анимации не умеет, но умеет переключать по pgup/pgdn фреймы. Таким же способом можно переключать слои и страницы в других форматах, которые это поддерживают.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от d_a

терпеть не могу вашего брата игродела. Вообще какие-то товарищи не от мира сего, то все пути захардкодят, то OpenGL подавай

Не беспокойся об этом, «игроделы» уже давно залезли во все приложения на Qt 5.

$ ldd `which qbittorrent` | grep GL
26:     libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f82aa47d000)
$ ldd `which nomacs` | grep GL
27:     libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f522ec78000)
EXL ★★★★★
()

Это интересно, я посмотрю, спасибо.

slon
()

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

Просмотрщик будет дико востребован, если в него добавить:

  • psd
  • jp2 (почти все оригиналы сканирования с archive.org и гугл книг идет в нем)
  • svg (есть же librsvg)
slon
()
Ответ на: комментарий от RazrFalcon

У тебя куть головного мозга.

anonymous
()
Ответ на: комментарий от slon

Нет, не пробовал. Меня в первую очередь интересовал линукс.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Нет. Что за формат и где используется? Открыты ли спецификации?

Вроде как RAW от адоба. Всякие лайтрумы равы от фотика конвертят в dng. Сейчас во многих телефонах если выбрать raw при съемке, то снимать будет именно в dng. Формат открытый, не свободный, как утверждают редакторы википедии.

По спекам вроде нашел какие-то первые ссылки в гугле, хз насколько это полезно. http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/dng_s...

slyjoeh ★★★
()
Ответ на: комментарий от andreyu

Базовая поддержка psd есть.

большего не требуется.

slon
()
Ответ на: комментарий от slyjoeh

Узкоспецифичная фича нужная полтора человекам на линуксе. Профессионально работающие с фото на линуксе не используют в своём воркфлоу подобное, а тем, кто мечется между платформами, так их мало и ради них стараться.

slon
()
Ответ на: комментарий от slyjoeh

Спасибо, вот что написано в документе:

DNG is an extension of the TIFF 6.0 format, and is compatible with the TIFF-EP standard. It is possible (but not required) for a DNG file to simultaneously comply with both the Digital Negative specification and the TIFF-EP standard.

Нет ли у вас файла в этом формате?

andreyu ★★★★★
() автор топика
Ответ на: Годная инициатива, одобряю от anonymous

А почему не в новостях?

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

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

andreyu ★★★★★
() автор топика
Ответ на: комментарий от slon

В общем идеальный просмотрщик это lilyview на макосе, пробовал?

Посмотрел, он не умеет нужные мне форматы, и не умеет в инфу о выделенной области.
Но да, большие изображения он грузит ОЧЕНЬ быстро. Хз, за счет чего это происходит.

andreyu ★★★★★
() автор топика
make[3]: *** [CMakeFiles/sviewgl.dir/build.make:351: CMakeFiles/sviewgl.dir/src/formats/formatgif.cpp.o] Error 1
make[3]: Leaving directory '/home/rom/Templates/simple-viewer-gl/.build'
make[2]: *** [CMakeFiles/Makefile2:68: CMakeFiles/sviewgl.dir/all] Error 2
make[2]: Leaving directory '/home/rom/Templates/simple-viewer-gl/.build'
make[1]: *** [Makefile:84: all] Error 2
make[1]: Leaving directory '/home/rom/Templates/simple-viewer-gl/.build'
cp .build/sviewgl .
cp: cannot stat '.build/sviewgl': No such file or directory

полный лог: http://pastebin.com/raw/Lwqp0vbr

slon
()
Ответ на: комментарий от slon

а, выше прочитал, что нужен старый 4.* giflib, увы тогда.

Там патч простой:

src/formats/formatgif.cpp:49:

GifFileType* gif_file = DGifOpenFileName(m_filename.c_str(), nullptr);

src/formats/formatgif.cpp:60:

DGifCloseFile(gif_file, nullptr);

andreyu ★★★★★
() автор топика
Ответ на: комментарий от slon

Залил в ветку development фикс для GifLib 5.x. Попробуйте собрать из нее:

$ git checkout development
$ git pull
$ make release

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Спасибо большое, собралось, работает. Уже нравится, я потестирую и опакечу в Void, пока патч из девелопмента не перейдет в мастер — будет налагаться патч в таком случае.

А под какой лицензией распространяется софт?

slon
()

media-gfx/sviewgl-9999.ebuild


кому надо, пока не ясно с лицензией поставил GPL:

# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=6

inherit cmake-utils git-r3

DESCRIPTION="Simple Viewer GL is a simple and tiny image viewer based on OpenGL"
HOMEPAGE="https://bitbucket.org/andreyu/simple-viewer-gl"
EGIT_REPO_URI="https://bitbucket.org/andreyu/simple-viewer-gl.git"
EGIT_BRANCH="development"
LICENSE="GPL-3"
SLOT="0"

DEPEND="dev-libs/libconfig[cxx]
	media-libs/freetype
	>media-libs/giflib-5.0.6
	media-libs/glfw
	media-libs/imlib2[X,jpeg,gif,png,tiff]
	sys-libs/zlib
	x11-libs/libXi
	x11-libs/libXmu
	virtual/opengl
	virtual/pkgconfig"

RDEPEND="${DEPEND}"

src_compile() {
	emake release
}

src_install() {
	dobin sviewgl
}

slon
()
Ответ на: комментарий от slon

Спасибо большое, собралось, работает. Уже нравится, я потестирую и опакечу в Void, пока патч из девелопмента не перейдет в мастер — будет налагаться патч в таком случае.

Ну раз все собирается, значит я залью фиксы в master. Так что патч не нужен будет.

А под какой лицензией распространяется софт?

Даже и не знаю, а какую стоит использовать?

andreyu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.