From 71d745d3ec72b321b3725d28a825101e975adc6e Mon Sep 17 00:00:00 2001 From: xiaoming <2014500726@smail.xtu.edu.cn> Date: Tue, 6 Feb 2024 13:04:52 +0800 Subject: [PATCH] Add mouse tracking and display color information Signed-off-by: xiaoming <2014500726@smail.xtu.edu.cn> --- .github/workflows/linux.yml | 5 ++-- .github/workflows/macos.yml | 53 +++++++++++++++++++++++++++++++++-- .github/workflows/windows.yml | 5 ++-- .gitignore | 3 +- README.md | 2 +- README_zh_CN.md | 2 +- YUVviewer.pro | 14 ++++----- dpkg/YUVviewer/DEBIAN/control | 2 +- src/ImgViewer.cpp | 34 ++++++++++++++++++++-- src/ImgViewer.h | 4 +++ src/YUVviewer.cpp | 9 ++++-- tools/generate_info.ps1 | 20 +++++++++++++ tools/generate_info.sh | 28 ++++++++++++++++++ version.txt | 2 +- 14 files changed, 159 insertions(+), 24 deletions(-) create mode 100644 tools/generate_info.ps1 create mode 100755 tools/generate_info.sh diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index d84b22a..b2f29d6 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -9,6 +9,8 @@ on: - 'README_zh_CN.md' - 'DEVELOPNOTE.md' - '.readthedocs.yaml' + tags: + - V** pull_request: branches: [ main ] paths-ignore: @@ -47,8 +49,7 @@ jobs: - name: Build all run: | git fetch --tags --force - git describe --always --long --dirty --abbrev=10 --tags | awk '{print "\""$0"\""}' > git_tag.inc - sed -i 's/git_tag.inc/git_tag.ci.inc/g' YUVviewer.pro + sed -i 's/--long --dirty/--long/g' ./tools/generate_info.sh sed -i 's/QT_DIR=\/opt\/Qt6.2.0\/6.2.0\/gcc_64/QT_DIR=$(cd "$(dirname "$0")";pwd)\/..\/Qt\/6.2.0\/gcc_64/g' build_deb.sh sed -i 's/\/home\/xiaoming\/Desktop\/opencv/\/usr\/local/g' build_deb.sh sed -i 's/\/home\/xiaoming\/Desktop\/opencv/\/usr\/local/g' partform_unix.pri diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index bc3a460..7360d98 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -9,6 +9,8 @@ on: - 'README_zh_CN.md' - 'DEVELOPNOTE.md' - '.readthedocs.yaml' + tags: + - V** pull_request: branches: [ main ] paths-ignore: @@ -49,8 +51,7 @@ jobs: - name: Build all run: | git fetch --tags --force - git describe --always --long --dirty --abbrev=10 --tags | awk '{print "\""$0"\""}' > git_tag.inc - sed -i'.original' -e 's/git_tag.inc/git_tag.ci.inc/g' YUVviewer.pro + sed -i'.original' -e 's/--long --dirty/--long/g' ./tools/generate_info.sh sed -i'.original' -e 's/QT_DIR=\/opt\/Qt6.2.0\/6.2.0\/gcc_64/QT_DIR=$(cd "$(dirname "$0")";pwd)\/..\/Qt\/6.2.0\/macos/g' build_dmg.sh sed -i'.original' -e 's/\/home\/xiaoming\/Desktop\/opencv/\/usr\/local/g' build_dmg.sh sed -i'.original' -e 's/\/home\/xiaoming\/Desktop\/opencv/\/usr\/local/g' partform_unix.pri @@ -67,3 +68,51 @@ jobs: run: | sudo hdiutil attach ./build_release/out/YUVviewer.dmg /Volumes/YUVviewer/YUVviewer.app/Contents/MacOS/YUVviewer --version + + macos_arm64: + runs-on: macos-14 + + steps: + - uses: actions/checkout@v4 + + - name: Install Qt + uses: jurplel/install-qt-action@v3.3.0 + with: + version: '6.2.0' + + - name: Install prerequisites + shell: bash -l {0} + run: | + ruby - e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2 > /dev/null + brew reinstall --build-from-source cmake + ln -s /usr/local/Cellar/cmake/3.27.1 /usr/local/Cellar/cmake/3.26.4 + brew install create-dmg + ruby - e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2 > /dev/null + brew install --build-from-source cmake + git clone https://github.com/opencv/opencv.git --branch 4.0.0 --depth 1 + cmake -S opencv -B opencv/build -D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_MSMF=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_DOCS=OFF -D WITH_JPEG=OFF -D WITH_FFMPEG=OFF -D CMAKE_BUILD_TYPE=RELEASE + cd ./opencv/build + make + sudo make install + + - name: Build all + run: | + git fetch --tags --force + sed -i'.original' -e 's/--long --dirty/--long/g' ./tools/generate_info.sh + sed -i'.original' -e 's/QT_DIR=\/opt\/Qt6.2.0\/6.2.0\/gcc_64/QT_DIR=$(cd "$(dirname "$0")";pwd)\/..\/Qt\/6.2.0\/macos/g' build_dmg.sh + sed -i'.original' -e 's/\/home\/xiaoming\/Desktop\/opencv/\/usr\/local/g' build_dmg.sh + sed -i'.original' -e 's/\/home\/xiaoming\/Desktop\/opencv/\/usr\/local/g' partform_unix.pri + ./build_dmg.sh + + - name: Upload build asserts + uses: actions/upload-artifact@v4.3.0 + with: + name: YUVviewer_macos + path: | + ./build_release/out/YUVviewer.dmg + + - name: Run tests + run: | + sudo hdiutil attach ./build_release/out/YUVviewer.dmg + /Volumes/YUVviewer/YUVviewer.app/Contents/MacOS/YUVviewer --version + \ No newline at end of file diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 85909ec..705cc09 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -9,6 +9,8 @@ on: - 'README_zh_CN.md' - 'DEVELOPNOTE.md' - '.readthedocs.yaml' + tags: + - V** pull_request: branches: [ main ] paths-ignore: @@ -69,8 +71,7 @@ jobs: - name: Build all run: | git fetch --tags --force - git describe --always --long --dirty --abbrev=10 --tags | ./tools/awk/awk.exe '{print \"\\\"\"$0\"\\\"\"}' > git_tag.inc - ./tools/sed/sed.exe -i "s/git_tag.inc/git_tag.ci.inc/g" YUVviewer.pro + ./tools/sed/sed.exe -i 's/--long --dirty/--long/g' ./tools/generate_info.ps1 ./tools/sed/sed.exe -i "s/QT_DIR=C:\/Qt\/Qt6.2.0\/6.2.0\/mingw81_32\/bin/QT_DIR=%Qt5_Dir%/g" ./build_setup.bat ./tools/sed/sed.exe -i "s/QT_TOOLS_DIR=C:\/Qt\/Qt6.2.0\/Tools\/mingw810_32\/bin/QT_TOOLS_DIR=C:\/ProgramData\/Chocolatey\/lib\/mingw\/tools\/install\/mingw64\/bin/g" ./build_setup.bat ./tools/sed/sed.exe -i "s/OPENCV_DIR=D:\/Qt\/opencv4.2.0\/x64\/mingw\/bin/OPENCV_DIR=C:\/opencv4.0.0\/x64\/mingw\/bin/g" ./build_setup.bat diff --git a/.gitignore b/.gitignore index 27f5ccd..d7d81e3 100644 --- a/.gitignore +++ b/.gitignore @@ -58,8 +58,7 @@ CMakeLists.txt.user* # rust /target -git_tag.inc -git_tag.ci.inc +build_info.inc .DS_Store lang/yuvviewer_en_US.qm lang/yuvviewer_ja_JP.qm diff --git a/README.md b/README.md index 9f95618..187a24e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # YUVviewer -English | [简体中文](./README_zh_CN.md) +🇺🇸 English | [🇨🇳 简体中文](./README_zh_CN.md) YUVviewer is a small tool for developers to view and preview various original image formats. It is based on the framework of Qt and opencv and supports windows/linux/macos. The interface is simple and clear, and the operation is portable. The main interface is as follows: diff --git a/README_zh_CN.md b/README_zh_CN.md index b69cdca..088f75e 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -12,7 +12,7 @@ # YUVviewer -[English](./README.md) | 简体中文 +[🇺🇸 English](./README.md) | 🇨🇳 简体中文 YUVviewer一款用于开发人员查看预览各种原始图像格式的小工具,其基于Qt和opencv的框架,支持windows/linux/macos,界面简单清晰,操作便携,主界面如下: diff --git a/YUVviewer.pro b/YUVviewer.pro index becbbf6..a6b16ac 100644 --- a/YUVviewer.pro +++ b/YUVviewer.pro @@ -88,7 +88,7 @@ win32:{ QMAKE_TARGET_DESCRIPTION = "YUVviewer based on Qt $$[QT_VERSION]" QMAKE_TARGET_COPYRIGHT = "GNU General Public License v3.0" - git_tag.commands = $$quote("cd $$PWD && git describe --always --long --dirty --abbrev=10 --tags | $$PWD/tools/awk/awk.exe \'{print \"\\\"\"\$$0\"\\\"\"}\' > git_tag.inc") + build_info.commands = $$quote("c:/Windows/system32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -File \"$$PWD/tools/generate_info.ps1\" > $$PWD/build_info.inc") } unix:!macx:{ @@ -105,7 +105,7 @@ unix:!macx:{ LIBS += -L $${OPENCV_DIR}/lib/ -lopencv_imgcodecs LIBS += -L $${OPENCV_DIR}/lib/ -lopencv_core - git_tag.commands = $$quote("cd $$PWD && git describe --always --long --dirty --abbrev=10 --tags | awk \'{print \"\\\"\"\$$0\"\\\"\"}\' > git_tag.inc") + build_info.commands = $$quote("cd $$PWD && ./tools/generate_info.sh > build_info.inc") } macx:{ @@ -122,12 +122,12 @@ macx:{ LIBS += -L $${OPENCV_DIR}/lib/ -lopencv_imgcodecs LIBS += -L $${OPENCV_DIR}/lib/ -lopencv_core - git_tag.commands = $$quote("cd $$PWD && git describe --always --long --dirty --abbrev=10 --tags | awk \'{print \"\\\"\"\$$0\"\\\"\"}\' > git_tag.inc") + build_info.commands = $$quote("cd $$PWD && ./tools/generate_info.sh > build_info.inc") } -git_tag.target = $$PWD/git_tag.inc -git_tag.depends = FORCE -PRE_TARGETDEPS += $$PWD/git_tag.inc -QMAKE_EXTRA_TARGETS += git_tag +build_info.target = $$PWD/build_info.inc +build_info.depends = FORCE +PRE_TARGETDEPS += $$PWD/build_info.inc +QMAKE_EXTRA_TARGETS += build_info ############################################################################### diff --git a/dpkg/YUVviewer/DEBIAN/control b/dpkg/YUVviewer/DEBIAN/control index 11695c2..35ab262 100755 --- a/dpkg/YUVviewer/DEBIAN/control +++ b/dpkg/YUVviewer/DEBIAN/control @@ -4,7 +4,7 @@ Architecture: amd64 Section: utils Depends: Recommends: -Source: YUVviewer +Source: yuvviewer Installed-Size: #SIZE# Priority: extra Maintainer: QQxiaoming <2014500726@smail.xtu.edu.cn> zhiliao007 diff --git a/src/ImgViewer.cpp b/src/ImgViewer.cpp index f859576..2b7f270 100644 --- a/src/ImgViewer.cpp +++ b/src/ImgViewer.cpp @@ -84,6 +84,7 @@ ImgViewer::ImgViewer(const QString &folderpath, QWidget *parent,QWidget *parentW setWindowTitle("loading file, please wait ...."); ui->left_PushButton->setFlat(true); ui->right_PushButton->setFlat(true); + setMouseTracking(true); QObject::connect(ui->left_PushButton, SIGNAL(clicked()), this, SLOT(previousImg())); QObject::connect(ui->right_PushButton, SIGNAL(clicked()), this, SLOT(nextImg())); left_click = false; @@ -214,23 +215,52 @@ void ImgViewer::draw_img(QPainter *painter) { painter->drawPixmap(this->point, QPixmap::fromImage(this->scaled_img)); } +void ImgViewer::draw_info(QPainter *painter) { + if (isMouseInImg) { + int r = qRed(currentMousePosColor); + int g = qGreen(currentMousePosColor); + int b = qBlue(currentMousePosColor); + int x = currentMousePos.x(); + int y = currentMousePos.y(); + QString info = QString("x:%1 y:%2 R:%3 G:%4 B:%5").arg(x).arg(y).arg(r).arg(g).arg(b); + QPen pen; + pen.setColor(Qt::black); + painter->setPen(pen); + painter->drawText(20, this->height() - 20, info); + } +} + void ImgViewer::paintEvent(QPaintEvent *event) { if (!this->img_list.empty()) { QPainter painter; painter.begin(this); draw_img(&painter); + draw_info(&painter); painter.end(); } - (void)event; + Q_UNUSED(event); } void ImgViewer::mouseMoveEvent(QMouseEvent *event) { if (!this->img_list.empty()) { + QRgb current_color = currentMousePosColor; + bool current_isMouseInImg = isMouseInImg; + if (this->scaled_img.rect().contains(event->pos()-this->point)) { + isMouseInImg = true; + currentMousePosColor = this->scaled_img.pixel(event->pos()-this->point); + currentMousePos = event->pos()-this->point; + } else { + isMouseInImg = false; + } if( this->left_click) { this->endPos = event->pos() - this->startPos; this->point = this->point + this->endPos; this->startPos = event->pos(); - this->repaint(); + this->update(); + } else { + if(current_color != currentMousePosColor || current_isMouseInImg != isMouseInImg) { + this->update(); + } } } (void)event; diff --git a/src/ImgViewer.h b/src/ImgViewer.h index 5ead084..50e2eed 100644 --- a/src/ImgViewer.h +++ b/src/ImgViewer.h @@ -91,6 +91,7 @@ private slots: private: void draw_img(QPainter *painter); + void draw_info(QPainter *painter); Ui::ImgViewerWindow *ui; ImgExport *imgExportWindow; QWidget *parentWindow; @@ -108,6 +109,9 @@ private slots: QPoint endPos; bool flipRGB = false; static void image_cleanup(cv::Mat* ptr); + QRgb currentMousePosColor; + QPoint currentMousePos; + bool isMouseInImg = false; }; #endif // IMGVIEWER_H diff --git a/src/YUVviewer.cpp b/src/YUVviewer.cpp index d24079b..e9f6a60 100644 --- a/src/YUVviewer.cpp +++ b/src/YUVviewer.cpp @@ -33,10 +33,13 @@ #include "YUVviewer.h" #include "ui_UI_YUVviewer.h" +#include "build_info.inc" + const QString VERSION = APP_VERSION; -const QString GIT_TAG = -#include -; +const QString GIT_TAG = BUILD_INFO; +const QString DATE_TAG = BUILD_DATE; +const QString HASH_TAG = BUILD_HASH; +const QString SHORT_HASH_TAG = BUILD_SHORT_HASH; const QList> YUVviewer::frameSizeTypeDict = { {"QQCIF", {"88","72"}}, diff --git a/tools/generate_info.ps1 b/tools/generate_info.ps1 new file mode 100644 index 0000000..13b7987 --- /dev/null +++ b/tools/generate_info.ps1 @@ -0,0 +1,20 @@ + +$git_info = $(git describe --always --long --dirty --abbrev=10 --tags) +$git_short_hash = $(git rev-parse --short HEAD) +$git_hash = $(git rev-parse HEAD) +$date_info = $([String]::Format("{0:yyyy-MM-ddTHH:mm:ss.fffZ}", $(Get-Date).ToUniversalTime())) + +Write-Output "#ifndef __BUILD_INFO_H__" +Write-Output "#define __BUILD_INFO_H__" +Write-Output "" +Write-Output "#define BUILD_INFO ""$git_info""" +Write-Output "#define BUILD_INFO_LEN $($git_info.Length)" +Write-Output "#define BUILD_HASH ""$git_hash""" +Write-Output "#define BUILD_HASH_LEN $($git_hash.Length)" +Write-Output "#define BUILD_SHORT_HASH ""$git_short_hash""" +Write-Output "#define BUILD_SHORT_HASH_LEN $($git_short_hash.Length)" +Write-Output "#define BUILD_DATE ""$date_info""" +Write-Output "#define BUILD_DATE_LEN $($date_info.Length)" +Write-Output "" +Write-Output "#endif // __BUILD_INFO_H__" + diff --git a/tools/generate_info.sh b/tools/generate_info.sh new file mode 100755 index 0000000..e469780 --- /dev/null +++ b/tools/generate_info.sh @@ -0,0 +1,28 @@ + +UNAMEOUT="$(uname -s)" +case "${UNAMEOUT}" in + Linux*) + date_info=$(date +"%Y-%m-%dT%H:%M:%S.%3NZ") + ;; + Darwin*) + date_info=$(gdate +"%Y-%m-%dT%H:%M:%S.%3NZ") + ;; +esac + +git_info=$(git describe --always --long --dirty --abbrev=10 --tags) +git_short_hash=$(git rev-parse --short HEAD) +git_hash=$(git rev-parse HEAD) + +echo "#ifndef __BUILD_INFO_H__" +echo "#define __BUILD_INFO_H__" +echo +echo "#define BUILD_INFO \"${git_info}\"" +echo "#define BUILD_INFO_LEN ${#git_info}" +echo "#define BUILD_HASH \"${git_hash}\"" +echo "#define BUILD_HASH_LEN ${#git_hash}" +echo "#define BUILD_SHORT_HASH \"${git_short_hash}\"" +echo "#define BUILD_SHORT_HASH_LEN ${#git_short_hash}" +echo "#define BUILD_DATE \"${date_info}\"" +echo "#define BUILD_DATE_LEN ${#date_info}" +echo +echo "#endif /* __BUILD_INFO_H__ */" diff --git a/version.txt b/version.txt index ad83b1b..dc2b74e 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.5.6 \ No newline at end of file +0.5.7 \ No newline at end of file