ImageProcessing-ElectronicPublications / scantailor-experimental

Scan Tailor Experimental is an interactive post-processing tool for scanned pages.
https://github.com/Tulon/scantailor/tree/experimental
GNU General Public License v3.0
34 stars 1 forks source link

OS: Windows #2

Closed zvezdochiot closed 12 months ago

zvezdochiot commented 1 year ago

Hi @plzombie , @trufanov-nok .

Интересует возможность сборки последнего релиза под винду. Уверен, что на этот раз "проблем" со сборкой будет поболее чем со ScanTailor Advanced. Ежели для сборки понадобятся изменение файлов cmake, вносите смело. Для повышения шансов на успех прилагаю свои сборочные файлы: scantailor-experimental-0.2023.07.27-build.zip (Linux devuan-zvezdochiot 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64 GNU/Linux) screen-threshold
noobie-iv commented 10 months ago

@zvezdochiot say:

в конкретно используемом Qt смотреть надо поддержку форматов и библиотек

А как в Qt эта поддержка работает? Саму Qt можно собирать с ключами "использовать системные libjpeg, libpng, libtiff". Без ключей она собирается с теми версиями, которые идут в комплекте - видимо, старыми и неполными. А исходные скрипты ST собирают Qt с ключами. Те плагины Qt, которые в результате в папке imageformats лежат - они зависят от этих библиотек? Прямых ссылок на dll оттуда нет. Если в них статически код из библиотек при сборке Qt забран - получается, надо еще и саму Qt пересобирать потом?

@plzombie say:

кто-то жаловался, что у него в сборке tiff с old-jpeg не работает

А где проблемный файл утянуть можно? Я когда пробовал разницу между libtiff с подключенной и отключенной libdeflate увидеть - не смог. То, что GIMP со сжатием deflate пишет, ST открывает независимо, была libdeflate подключена, или нет.

plzombie commented 10 months ago

Qt у меня официальная сборка, не знаю, что там. А насчёт tiff, там отдельный код для загрузки tiff в классе ImageLoader. Через TiffReader

plzombie commented 10 months ago

@noobie-iv вот кто-то в одном из форков sta жаловался https://github.com/ScanTailor-Advanced/scantailor-advanced/issues/79 Насчёт libdeflate, я прочитал, это просто быстрая альтернатива zlib. Используется обе (zlib - когда нельзя использовать libdeflate). Можно с ней не собирать

noobie-iv commented 10 months ago

@plzombie

вот кто-то в одном из форков sta жаловался

У меня сборка открывает тот файл. Но поддержка OldJPEG, видимо - заслуга libjpeg-turbo. Если ее удалить, в протоколе cmake отчет о поддержке пропадает, но вместе с самим форматом JPEG. Возможно, оригинальный libjpeg так не умеет. Или не умел до определенной версии. Или там тоже галочка Вкл/Выкл есть.

libtiff1

это просто быстрая альтернатива zlib

Да кто ж их разберет. Например, у GIMP при экспорте это два разных пункта. Впрочем, файлы читаются при обоих вариантах выбора без подключения libdeflate.

libtiff3

plzombie commented 10 months ago

@zvezdochiot @noobie-iv Я посмотрел, у меня все Tiff файлы открывает. Включая файл old-jpeg из того тикета. Так что убрал надпись release.preview из файла установщика. Потом может быть добавлю все остальные возможные форматы

plzombie commented 10 months ago

Так. Я не смогу собрать версию под ARM64, потому что boost отсутствует под arm64 под винду https://github.com/boostorg/build/issues/305 Всё что у меня получилось - это эти три файлика. изображение

Но зато я допилил инсталлятор и скрипт, и теперь он детектит ARM. Позже протестирую всё детально и добавлю коммитом.

zvezdochiot commented 10 months ago

@plzombie say:

потому что boost отсутствует под arm64 под винду

Уход от boost будет "слегка" проблематичным. Хотя что то с этим делать всё-равно надо. Большая часть варнингов при сборке относится именно к boost, мол пользуется deprecated-метод и т.д. и т.п.

PS: Опубликовал новость на 32-битный релиз.

plzombie commented 10 months ago

Только на xp она не заработает. Максимум под вистой. Под xp надо ещё qt5.6 собирать и отдельно пересобирать все библиотеки. Это больше для тех, у кого древний ноут с 2гб оперативки и кому не имеет смысла ставить 64bit винду

plzombie commented 10 months ago

Вот такую плашечку показывает, когда пытаешься версию для x86-64 запустить на arm64. Правда, для Windows 11 это не актуально. Но я не знаю, как в nsis правильно определить версию винды. И Windows 11 on ARM у меня нет изображение

plzombie commented 10 months ago

@zvezdochiot я добавил установщик в менеджер пакетов winget (аналог apt в windows 10). Так что бинарники в установщике не трогаем, вообще никак, совсем. Пока только x86 версию, как заапрувят, добавлю и x64

https://github.com/microsoft/winget-pkgs/pull/122756

plzombie commented 10 months ago

@zvezdochiot Касательно ARM64. Я собрал без буста, он там нужен только для тестов, добавил отключение флагом -D STE_NO_TESTS=ON. Но вот сама версия Qt под ARM64, которая у меня есть, не хочет компилироваться из коробки. Потому что там какой-то части утилит вообще нет, а другая написана на ARM64. Нужно либо компилировать прямо из-под ARM64, либо искать какой-то способ кросс-компиляции, я не знаю. Также поправил файлы cmake, чтобы собирались с Qt6 (как там код компилируется, я пока не знаю, не проверял).

Можешь скинуть мне исходники последней стабильной сборки Qt6? Я не могу найти на сайте, а Qt Maintenance Tool ожидаемо не работает

zvezdochiot commented 10 months ago

@plzombie say:

Можешь скинуть мне исходники последней стабильной сборки Qt6?

Ты нашёл у кого спросить. Я по Qt4 во всю скучаю, считай "с тоски вою", а ты мне про Qt6 рассказы рассказываешь. Даром он мне не дался. Знать его не знаю и знать не хочу. ;)

noobie-iv commented 10 months ago

https://download.qt.io/archive/qt/6.6/6.6.0/single/qt-everywhere-src-6.6.0.tar.xz

plzombie commented 10 months ago

@zvezdochiot да можно, кстати, и под Qt4 сделать cmake-файлы по аналогии, но кода придётся больше менять. (Под Qt6, я надеюсь, и так скомпилируется). Мне этот Qt6 нужен только для того, что это единственная версия под винду на ARM десктопную, Остальные я буду собирать 5-й

plzombie commented 10 months ago

https://download.qt.io/archive/qt/6.6/6.6.0/single/qt-everywhere-src-6.6.0.tar.xz

Я теперь и оттуда не могу ничего скачать. Всё. Qt забанил Россию. Буду выкачивать 700мб через Tor Browser 🤣

noobie-iv commented 10 months ago

Буду выкачивать 700мб через Tor Browser

Да я так и делал. Вполне себе быстро заливается. Иногда и с гитхаба слить через тор быстрее выходит.

plzombie commented 10 months ago

@zvezdochiot у тебя под линуксом тест .\generic_tests проходит? Очень похоже на ошибки округления double. Я могу точность понизить, чтобы тест под виндой проходил. Но если под линуксом всё нормально, то надо разбираться, что там под виндой конкретно

noobie-iv commented 10 months ago

Win10x64:

generic_tests: tests/TestQtPolygonIntersection.cpp(42): error: in "QtPolygonIntersectionTestSuite/test_QTBUG_48003": check !p1.intersected(p2).isEmpty() has failed

opencl_tests: acceleration/opencl/tests/TestAffineTransform.cpp(172): error: in "AffineTransformTestSuite/test_argb": check max_err <= 15 has failed [16 > 15]

plzombie commented 10 months ago

@noobie-iv У меня opencl_tests проходит, странно. Только этот generic с intersection

noobie-iv commented 10 months ago

А в STU у меня generic_tests проходит, можно еще с ним сравнить.

plzombie commented 10 months ago

Для поддержки Qt6, видимо, надо добавить совместимость с C++17. Читаю вот эту вот статью, и ещё меньше хочется копаться в этом языке. Только Си, только хардкор

zvezdochiot commented 10 months ago

@plzombie :

./generic_tests
Running 11 test cases...
/media/buf/zvezdochiot/dists/git/ORGS/ORG.IPEP/GUI/scantailor-all/scantailor-experimental-w/src/tests/TestQtPolygonIntersection.cpp(42): error: in "QtPolygonIntersectionTestSuite/test_QTBUG_48003": check !p1.intersected(p2).isEmpty() has failed

*** 1 failure is detected in the test module "Master Test Suite"
./imageproc_tests
Running 101 test cases...
/media/buf/zvezdochiot/dists/git/ORGS/ORG.IPEP/GUI/scantailor-all/scantailor-experimental-w/src/imageproc/tests/TestSkewFinder.cpp(80): fatal error: in "SkewFinderTestSuite/test_positive_detection": critical check fabs(skew.angle() - 4.5) < 0.15 has failed

*** 1 failure is detected in the test module "Master Test Suite"

PS: Ветка под Qt6 по моему лишняя. Ты же пользуешь условую компиляцию, так что можно смело вносить в основную ветвь.

plzombie commented 10 months ago

@zvezdochiot Я в этой ветке буду править код (не файлы cmake). Возможно, придётся какие-то другие классы Qt использовать, более новые. И чтоб точно ничего не поломать, лучше всё в отдельной ветке делать. А потом из ветки support-qt6 смерджу всё в main. В общем, моя цель - максимально ничего не поломать😉

zvezdochiot commented 10 months ago

Hi @plzombie .

Говорят на RU-BOARD, что опять алерт вылез, только уже на 32битку.

plzombie commented 10 months ago

@zvezdochiot virustotal говорит, что майкрософт говорит, что норм. Скажи лучше, как такие баги править? Есть конструктор класса вида:

    DespeckleResult(
        QPointer<DespeckleView> const& owner,
        IntrusivePtr<TaskCancelHandle> const& cancel_handle,
        DespeckleState const& despeckle_state,
        DespeckleVisualization const& visualization,
        std::unique_ptr<DebugImagesImpl>& debug_images);

Есть код, его использующий Собственно, сам конструктор

DespeckleView::DespeckleResult::DespeckleResult(
    QPointer<DespeckleView> const& owner,
    IntrusivePtr<TaskCancelHandle> const& cancel_handle,
    DespeckleState const& despeckle_state,
    DespeckleVisualization const& visualization,
    std::unique_ptr<DebugImagesImpl>& debug_images)
    :   m_ptrOwner(owner),
      m_ptrCancelHandle(cancel_handle),
      m_ptrDbg(debug_images),
      m_despeckleState(despeckle_state),
      m_visualization(visualization)
{
}

И вот ещё функция, создающая объект класса

return BackgroundExecutor::TaskResultPtr(
                   new DespeckleResult(
                       m_ptrOwner, m_ptrCancelHandle,
                       m_despeckleState, visualization, m_ptrDbg
                   )
               );

Изначально там было std::auto_ptr<DebugImagesImpl> debug_images. Я заменил на std::unique_ptr, так как std::auto_ptr отсутствует в C++17, и с Qt6 его не собрать. Было куча ошибок. Тогда я добавил передачу по ссылке std::unique_ptr<DebugImagesImpl>& debug_images. Ошибка стала одна. Но зато какая...

[ 75%] Building CXX object src/filters/output/CMakeFiles/output.dir/DespeckleView.cpp.obj
DespeckleView.cpp
F:\NonOfMyBusiness\scantailor-experimental\scantailor-experimental-support-qt6\src\filters\output\DespeckleView.cpp(333): error C2280: "std::unique_ptr<DebugImagesImpl,std::default_delete<DebugImagesImpl>>::unique_ptr(const std::unique_ptr<DebugImagesImpl,std::default_delete<DebugImagesImpl>> &)": предпринята попытка ссылки на удаленную функцию
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\memory(3237): note:  см. объявление "std::unique_ptr<DebugImagesImpl,std::default_delete<DebugImagesImpl>>::unique_ptr"
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\memory(3237): note: "std::unique_ptr<DebugImagesImpl,std::default_delete<DebugImagesImpl>>::unique_ptr(const std::unique_ptr<DebugImagesImpl,std::default_delete<DebugImagesImpl>> &)": функция явно удалена.

И вот хрен ты разберёшь, что за функция там явно удалена

UPD: Там, оказывается, запрещён конструктор копирования. Но при этом объект std::unique_ptr можно вернуть из функции. Магия какая-то. В любом случае, разобрался и починил. Вроде бы ничего не сломал (потестил немного, кроме cli версии)

zvezdochiot commented 10 months ago

Hi @plzombie .

https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/commit/b0f88c7d20b02fecb0642ff6ea217624cc2c172a в Debian 11, Qt5 как минимум компилится. Минимальные тесты на специально подобранном материале бзиков не показали. :+1:

plzombie commented 10 months ago

О, прекрасно. Попробуй ещё интерфейс потыкать. Что всё открывается как надо. У меня вроде работало

noobie-iv commented 10 months ago

Магия какая-то.

Это еще белая магия. А у меня вот - черная. Пытаюсь собрать STU.

Когда репозиторий клонирую через git clone, собранная программа глючит:

BAD

Но когда скачиваю zip - собирается как положено:

GOOD

Исходники идентичны, отличаются только стилем перевода строки: у архива LF, у клона CRLF. CRаные LF! Целый день убил, пока причину нашел.

zvezdochiot commented 10 months ago

Hi @noobie-iv .

А в настройках Git разве нельзя эту core.autocrlf прописать? Хотя он по-моему только в истории git будет хранить LF, а в текущем состоянии CRLF. Так что хз, как это победить.

@plzombie say:

Попробуй ещё интерфейс потыкать.

Так я вроде потыкал на своих отобранных тестовых страницах.

plzombie commented 10 months ago

@zvezdochiot у меня вопрос немного не по теме. Как ты в debian 11/12 ставишь qt5? У меня qt creator его не видит, cmake тоже. Вот такое вот полотно изображение qtbase5-dev естественно установлен

zvezdochiot commented 10 months ago

@plzombie .

apt-file search /usr/share/applications/linguist-qt5.desktop 
qttools5-dev-tools: /usr/share/applications/linguist-qt5.desktop

Как вариант:

sudo apt install qttools5-dev qttools5-dev-tools

PS:

apt search qttools5
Сортировка… Готово
Полнотекстовый поиск… Готово

qttools5-dev/oldstable,now 5.15.2-5 amd64 [установлен]
  Qt 5 tools development files

qttools5-dev-tools/oldstable,now 5.15.2-5 amd64 [установлен, автоматически]
  инструменты разработчика на Qt 5

qttools5-doc/oldstable,now 5.15.2-5 all [установлен, автоматически]
  Qt 5 tools documentation

qttools5-doc-html/oldstable 5.15.2-5 all
  Qt 5 tools HTML documentation

qttools5-examples/oldstable 5.15.2-5 amd64
  Qt 5 tools examples

qttools5-private-dev/oldstable 5.15.2-5 amd64
  Qt 5 tools private development files
noobie-iv commented 10 months ago

CRLF. Так что хз, как это победить.

Пофиксил уже. Там в загрузке диалога при разборе ресурса захардкожены LF. Раз уж STEX - ранняя ветка STU, и проще всего фишки тырить из STU, а не писать с нуля, пусть тут будет для сведения, если кому собрать STU понадобится:

SettingsDialog.cpp 264: - QStringList tree_data = QString::fromUtf8((char const)tree_metadata.data(), tree_metadata.size()).split('\n'); 264: +QStringList tree_data = QString::fromUtf8((char const)tree_metadata.data(), tree_metadata.size()).split(QRegExp("\r?\n"));

plzombie commented 10 months ago

@zvezdochiot Продублирую сдесь, а то оригинальный коммент удалился после git rebase main. support-qt - это ветка для поддержки сборки под Qt6. В итоге будет собираться и под Qt5 (по умолчанию), и под Qt6 (с флагом -D ST_USE_QT6=ON). Я её потом солью с main, эту ветку. Просто чтобы случайно тебе релиз не испортить какими-нибудь багами, которые вылезут во время портирования, создал отдельную ветку. А так да, я всегда тестирую, что под Qt5 тоже компилируется. А сама поддержка Qt6 нужна, чтобы сделать уже поддержку сборки под arm под винду

zvezdochiot commented 10 months ago

@plzombie say:

Просто чтобы случайно тебе релиз не испортить

Ну не знаю. Была бы одна ветка, то "поломку" бы сразу, или почи сразу обнаружили бы. Ну да ладно, считаешь, что надо перестраховаться, знать так и делай. А с мержем потом как-нибудь разберёмся.

plzombie commented 10 months ago

Я все изменения из main сразу тяну в support-qt6 через git rebase main. Так что их перетестировать не придётся, только изменения по qt6

plzombie commented 10 months ago

Я вроде как сделал сборку, но у меня теперь тесты не проходит в файле src/imageproc/tests/TestScale.cpp

plzombie commented 10 months ago

@zvezdochiot там было 6 тестов. 4 из них были закоменчены, видимо, потому, что они валились. Сейчас под qt5 всё нормально (в смысле, те 2 нормально отрабатывают), под qt6 валится всё

plzombie commented 10 months ago

Код я в том файле вообще не трогал, который растягивает изображения

plzombie commented 10 months ago

@zvezdochiot Ещё я заметил. Ещё в релизе 10.11, в котором я вообще ничего не правил, игнорируется иногда значение поворота изображение

plzombie commented 10 months ago

Я не понимаю, откуда эти поля появились. Надо ещё в "Полезная область" добавить кнопку 100%

plzombie commented 10 months ago

@zvezdochiot @noobie-iv Вот последние сборки из ветки под qt6 https://disk.yandex.ru/d/snhL1yq8PuGvzQ Коммит morphology ON/OFF я туда не включал. Можно потестировать. Без понятия, если честно, почему чб изображение проваливает тест на qt6. Либо это из-за другой версии стандарта c++(17 против 11), либо изначально тест кривой был (поэтому там 4/6 тестов и были закомменчены)

plzombie commented 10 months ago

Что за пакет qt5-linguist в дебиане? Я не могу собрать в debian 10, в альте всё норм, в дебиане вообще нет сочетания qt5 и linguist

plzombie commented 10 months ago

А по поводу компиляции под arm под винду, ради чего это всё и затевалось. Вот такие вот тут вопросы на форуме, без ответов https://forum.qt.io/topic/133602/help-working-on-windows-arm-devices-qt6 Блин, идиоту очевидно, что у майкрософт есть тулзы для кросскомпиляции под арм. Я ими с самого начала пользовался. Где такие же тулзы от создателей Qt?

plzombie commented 10 months ago

https://www.qt.io/blog/qt-for-windows-on-arm короче, мне надо ставить вижуалстудию и полноценный qt на ноут. А на ноуте у меня всего 64gb и всё уже забито под завязку всякими утилитами и прочим. А искать здесь или заказывать из-за рубежа новый ноут ради хобби мне как-то не с руки. Да и x86 версия прекрасно работает на Windows 10 for ARM. Печально всё это

zvezdochiot commented 10 months ago

@plzombie say:

игнорируется иногда значение поворота

Выложи куда-нибудь и фотки и проект. Посмотрю в чём сыр бор. Возможно ты используешь режим выравнивания между фотками (шаг 5.Margins).

PS: Перед обработкой фоток в ST рекомендую применять libjpegqs.

@plzombie say:

Что за пакет qt5-linguist в дебиане?

qttools5-dev-tools (ну и желателен qttools5-dev).

PS: Для Qt6, соответственно, должно быть qttools6, но может такого и вообще не быть. Хз.

plzombie commented 10 months ago

@zvezdochiot 1) положил в папку к экзешникам архив stetest.zip 2) Какой qt6 в десятом дебиане, ты что? Я скорее в 4 поверю)

plzombie commented 10 months ago

@zvezdochiot я там каким-то образом на вкладке "Полезная область" выбрал больше, чем вообще есть на изображении. Так что это не поворот скорее всего

zvezdochiot commented 10 months ago

@plzombie say:

каким-то образом на вкладке "Полезная область" выбрал больше, чем вообще есть на изображении.

Скопировал с другой == "Применить ко всем".

plzombie commented 10 months ago

Да, какая-то фигня на стадии select-content

<page id="16">
        <params mode="manual">
          <content-box>
            <top x="2013.241609671571" y="-17.33817780457677"/>
            <bottom x="1986.758390328428" y="3017.338177804577"/>
            <left x="-12.93699998435387" y="1482.43336493001"/>
            <right x="4012.936999984353" y="1517.56663506999"/>
          </content-box>
          <content-size-px height="3034.676355609154" width="4025.873999968707"/>
          <dependencies>
            <transform-fingerprint>8ecc0176cd54e95f626407394431e97689d689c9</transform-fingerprint>
          </dependencies>
        </params>
      </page>
plzombie commented 10 months ago

@plzombie say:

каким-то образом на вкладке "Полезная область" выбрал больше, чем вообще есть на изображении.

Скопировал с другой == "Применить ко всем".

Там они все 4000х3000, и я их руками растягивал. Вообще, всё-таки, нужна кнопка 100% или вроде того