[App Sharing] 羽云 GIF 编辑器2正式版1.0.0发布 Resolved
Tofloor
poster avatar
寂静的羽夏
deepin
2024-10-07 13:45
Author

羽云 GIF 编辑器2是我之前项目 羽云 GIF 编辑器的重构版本,相对于老版本的 WingGifEditor,它修复了一些 Bug,并且具有了小小的插件系统,用于实现扩展图像编辑。并且具有更现代的用户界面,更快的 Gif 图像加载速度和保存速度以及相对较低的内存占用,更好的图像编辑体验。开源协议是 AGPL-3.0。

screenshot.png

在老版本的这个问题也得到了修复,虽然没有人回答( https://gitee.com/wing-cloud/wing-gif-editor/issues/I5JR3S ):

现在:

屏幕截图_20241007_134056.png

这个软件极大的继承了我的羽云十六进制编辑器2的成果,功能得到了很大的提升,让它真正的成为一个好用的 GIF 编辑器。

有一说一 QListView 虽然用起来很麻烦,但对应用功能和性能的提升还是很高的。


Github:https://github.com/Wing-summer/WingGifEditor2

Gitee:https://gitee.com/wing-cloud/WingGifEditor2 (镜像)

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2024-10-07 13:56
#1
Reply View the author
乾豫恒益
deepin
2024-10-07 14:07
#2

like

Reply View the author
出售星辰之书的书商
Moderator
2024-10-07 14:31
#3

还有这种好东西 收藏了收藏了

like

Reply View the author
小小怪冲啊!
deepin
2024-10-07 19:17
#4

like like

Reply View the author
Oli
deepin
2024-10-07 20:51
#5

like like

Reply View the author
lizipeng0013
deepin
2024-10-07 23:51
#6

标题忘记改了吧,怎么是十六进制编辑器啊

Reply View the author
寂静的羽夏
deepin
2024-10-08 11:56
#7
lizipeng0013

标题忘记改了吧,怎么是十六进制编辑器啊

哦哦,应该是文本翻译出问题了,我有时间改一下图。

Reply View the author
kero990
deepin
2024-10-08 17:18
#8

hi又是我,和上次类似的问题,部分子模块使用了c++20的特性,以至于使用debian10底层的uos专业版无法编译

这次的报错来自

~/WingGifEditor2/3rdparty/qwindowkit/qmsetup/src/corecmd/main.cpp: In function 'void copyDirectory(const std::filesystem::__cxx11::path&, const std::filesystem::__cxx11::path&, const std::filesystem::__cxx11::path&, bool, bool, const std::function&)':
~/WingGifEditor2/3rdparty/qwindowkit/qmsetup/src/corecmd/main.cpp:173:40: error: 'std::__cxx11::string' {aka 'class std::__cxx11::basic_string'} has no member named 'starts_with'
                      linkPath.string().starts_with(srcRootDir.string())
                                        ^~~~~~~~~~~
Reply View the author
寂静的羽夏
deepin
2024-10-08 19:17
#9
kero990

hi又是我,和上次类似的问题,部分子模块使用了c++20的特性,以至于使用debian10底层的uos专业版无法编译

这次的报错来自

~/WingGifEditor2/3rdparty/qwindowkit/qmsetup/src/corecmd/main.cpp: In function 'void copyDirectory(const std::filesystem::__cxx11::path&, const std::filesystem::__cxx11::path&, const std::filesystem::__cxx11::path&, bool, bool, const std::function&)':
~/WingGifEditor2/3rdparty/qwindowkit/qmsetup/src/corecmd/main.cpp:173:40: error: 'std::__cxx11::string' {aka 'class std::__cxx11::basic_string'} has no member named 'starts_with'
                      linkPath.string().starts_with(srcRootDir.string())
                                        ^~~~~~~~~~~

嘿,这我肯定想到了,你肯定没好好看 CMakeList 文件。把选项 WINGGIF_USE_FRAMELESS关掉就好啦,和我那个十六进制编辑器一样的操作即可。

pride

Reply View the author
我樂苦多
deepin
2024-10-09 08:29
#10

能否打包成applmage包

Reply View the author
寂静的羽夏
deepin
2024-10-09 09:12
#11
我樂苦多

能否打包成applmage包

这个我尝试打过,但我不会打,打包后的程序跑不起来。😂

这个程序不需要 root 权限,我考虑打包成 flatpak 、 appimage、linglong 包。不过前两者在大多数 Linux 发行版比较通用。等我周末再尝试。

Reply View the author
kero990
deepin
2024-10-09 09:21
#12
寂静的羽夏

嘿,这我肯定想到了,你肯定没好好看 CMakeList 文件。把选项 WINGGIF_USE_FRAMELESS关掉就好啦,和我那个十六进制编辑器一样的操作即可。

pride

啊,其实我根本看不懂CMakeLists

现在遇到了一个这样的报错

root/WingGifEditor2/src/dialog/framelessdialogbase.cpp:68:12: error: invalid use of incomplete type 'class QKeyEvent'
     if (evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return)
            ^~
In file included from /opt/runtime/qt/include/QtWidgets/qdialog.h:44,
                 from /opt/runtime/qt/include/QtWidgets/QDialog:1,
                 from /root/WingGifEditor2/src/dialog/framelessdialogbase.h:8,
                 from /root/WingGifEditor2/src/dialog/framelessdialogbase.cpp:1:
/opt/runtime/qt/include/QtWidgets/qwidget.h:75:7: note: forward declaration of 'class QKeyEvent'
 class QKeyEvent;
       ^~~~~~~~~
/root/WingGifEditor2/src/dialog/framelessdialogbase.cpp:68:43: error: invalid use of incomplete type 'class QKeyEvent'
     if (evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return)
                                           ^~
In file included from /opt/runtime/qt/include/QtWidgets/qdialog.h:44,
                 from /opt/runtime/qt/include/QtWidgets/QDialog:1,
                 from /root/WingGifEditor2/src/dialog/framelessdialogbase.h:8,
                 from /root/WingGifEditor2/src/dialog/framelessdialogbase.cpp:1:
/opt/runtime/qt/include/QtWidgets/qwidget.h:75:7: note: forward declaration of 'class QKeyEvent'
 class QKeyEvent;
       ^~~~~~~~~

我不熟悉qt,现在的qt环境是我自己编译的5.15.10,我不知道是不是缺什么模块

Reply View the author
寂静的羽夏
deepin
2024-10-09 09:25
#13

你要是通过直接编译,直接在 framelessdialogbase.cpp 加上 #include 就行了。这个版本的 QT 我没有做过检查,你可以在 github 给我提个 issue 备忘一下,这个我周末处理。

Reply View the author
kero990
deepin
2024-10-09 11:46
#14
寂静的羽夏

你要是通过直接编译,直接在 framelessdialogbase.cpp 加上 #include 就行了。这个版本的 QT 我没有做过检查,你可以在 github 给我提个 issue 备忘一下,这个我周末处理。

好的,除了这个之外

src/dialog/gifsavedialog.cpp也缺少 #include

==========================================

现在卡在这里

/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::cropFrames(const QRect&)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:20: error: found ':' in nested-name-specifier, expected '::'
     for (auto &img : _data) {
                    ^
                    ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:16: error: 'img' has not been declared
     for (auto &img : _data) {
                ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:27: error: qualified-id in declaration before ')' token
     for (auto &img : _data) {
                           ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:218:6: error: expected ';' before 'dataChanged'
     }
      ^
      ;
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:220:10:
     emit dataChanged(this->index(0), this->index(_data.size() - 1));
          ~~~~~~~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:221:34: error: expected ')' before ';' token
     updateLinkedListViewCurrent();
                                  ^
                                  )
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:9: note: to match this '('
     for (auto &img : _data) {
         ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:5: error: expected iteration declaration or initialization
     for (auto &img : _data) {
     ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::scaleFrames(int, int)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:20: error: found ':' in nested-name-specifier, expected '::'
     for (auto &img : _data) {
                    ^
                    ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:16: error: 'img' has not been declared
     for (auto &img : _data) {
                ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:27: error: qualified-id in declaration before ')' token
     for (auto &img : _data) {
                           ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:271:6: error: expected ';' before 'dataChanged'
     }
      ^
      ;
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:273:10:
     emit dataChanged(this->index(0), this->index(_data.size() - 1));
          ~~~~~~~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:274:34: error: expected ')' before ';' token
     updateLinkedListViewCurrent();
                                  ^
                                  )
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:9: note: to match this '('
     for (auto &img : _data) {
         ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:5: error: expected iteration declaration or initialization
     for (auto &img : _data) {
     ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::flipFrames(Qt::Orientation, int, qsizetype)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:24: error: found ':' in nested-name-specifier, expected '::'
         for (auto &img : _data) {
                        ^
                        ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:20: error: 'img' has not been declared
         for (auto &img : _data) {
                    ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:31: error: qualified-id in declaration before ')' token
         for (auto &img : _data) {
                               ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:284:10: error: expected ';' before 'break'
         }
          ^
          ;
         break;
         ~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:285:9: error: expected primary-expression before 'break'
         break;
         ^~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:286:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:285:15: error: expected ')' before '}' token
         break;
               ^
               )
     }
     ~    
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:13: note: to match this '('
         for (auto &img : _data) {
             ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:286:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:9: error: expected iteration declaration or initialization
         for (auto &img : _data) {
         ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:24: error: found ':' in nested-name-specifier, expected '::'
         for (auto &img : _data) {
                        ^
                        ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:20: error: 'img' has not been declared
         for (auto &img : _data) {
                    ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:31: error: qualified-id in declaration before ')' token
         for (auto &img : _data) {
                               ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:291:10: error: expected ';' before 'break'
         }
          ^
          ;
         break;
         ~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:292:9: error: expected primary-expression before 'break'
         break;
         ^~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:293:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:292:15: error: expected ')' before '}' token
         break;
               ^
               )
     }
     ~    
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:13: note: to match this '('
         for (auto &img : _data) {
             ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:293:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:9: error: expected iteration declaration or initialization
         for (auto &img : _data) {
         ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::rotateFrames(bool)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:20: error: found ':' in nested-name-specifier, expected '::'
     for (auto &img : _data) {
                    ^
                    ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:16: error: 'img' has not been declared
     for (auto &img : _data) {
                ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:27: error: qualified-id in declaration before ')' token
     for (auto &img : _data) {
                           ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:322:6: error: expected ';' before 'dataChanged'
     }
      ^
      ;
     emit dataChanged(this->index(0), this->index(_data.size() - 1));
          ~~~~~~~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:324:34: error: expected ')' before ';' token
     updateLinkedListViewCurrent();
                                  ^
                                  )
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:9: note: to match this '('
     for (auto &img : _data) {
         ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:5: error: expected iteration declaration or initialization
     for (auto &img : _data) {
     ^~~

你编译的qt是什么版本呢

Reply View the author
寂静的羽夏
deepin
2024-10-09 12:40
#15
kero990

好的,除了这个之外

src/dialog/gifsavedialog.cpp也缺少 #include

==========================================

现在卡在这里

/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::cropFrames(const QRect&)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:20: error: found ':' in nested-name-specifier, expected '::'
     for (auto &img : _data) {
                    ^
                    ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:16: error: 'img' has not been declared
     for (auto &img : _data) {
                ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:27: error: qualified-id in declaration before ')' token
     for (auto &img : _data) {
                           ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:218:6: error: expected ';' before 'dataChanged'
     }
      ^
      ;
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:220:10:
     emit dataChanged(this->index(0), this->index(_data.size() - 1));
          ~~~~~~~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:221:34: error: expected ')' before ';' token
     updateLinkedListViewCurrent();
                                  ^
                                  )
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:9: note: to match this '('
     for (auto &img : _data) {
         ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:216:5: error: expected iteration declaration or initialization
     for (auto &img : _data) {
     ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::scaleFrames(int, int)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:20: error: found ':' in nested-name-specifier, expected '::'
     for (auto &img : _data) {
                    ^
                    ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:16: error: 'img' has not been declared
     for (auto &img : _data) {
                ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:27: error: qualified-id in declaration before ')' token
     for (auto &img : _data) {
                           ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:271:6: error: expected ';' before 'dataChanged'
     }
      ^
      ;
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:273:10:
     emit dataChanged(this->index(0), this->index(_data.size() - 1));
          ~~~~~~~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:274:34: error: expected ')' before ';' token
     updateLinkedListViewCurrent();
                                  ^
                                  )
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:9: note: to match this '('
     for (auto &img : _data) {
         ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:268:5: error: expected iteration declaration or initialization
     for (auto &img : _data) {
     ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::flipFrames(Qt::Orientation, int, qsizetype)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:24: error: found ':' in nested-name-specifier, expected '::'
         for (auto &img : _data) {
                        ^
                        ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:20: error: 'img' has not been declared
         for (auto &img : _data) {
                    ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:31: error: qualified-id in declaration before ')' token
         for (auto &img : _data) {
                               ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:284:10: error: expected ';' before 'break'
         }
          ^
          ;
         break;
         ~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:285:9: error: expected primary-expression before 'break'
         break;
         ^~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:286:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:285:15: error: expected ')' before '}' token
         break;
               ^
               )
     }
     ~    
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:13: note: to match this '('
         for (auto &img : _data) {
             ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:286:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:282:9: error: expected iteration declaration or initialization
         for (auto &img : _data) {
         ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:24: error: found ':' in nested-name-specifier, expected '::'
         for (auto &img : _data) {
                        ^
                        ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:20: error: 'img' has not been declared
         for (auto &img : _data) {
                    ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:31: error: qualified-id in declaration before ')' token
         for (auto &img : _data) {
                               ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:291:10: error: expected ';' before 'break'
         }
          ^
          ;
         break;
         ~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:292:9: error: expected primary-expression before 'break'
         break;
         ^~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:293:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:292:15: error: expected ')' before '}' token
         break;
               ^
               )
     }
     ~    
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:13: note: to match this '('
         for (auto &img : _data) {
             ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:293:5: error: expected primary-expression before '}' token
     }
     ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:289:9: error: expected iteration declaration or initialization
         for (auto &img : _data) {
         ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp: In member function 'void GifContentModel::rotateFrames(bool)':
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:20: error: found ':' in nested-name-specifier, expected '::'
     for (auto &img : _data) {
                    ^
                    ::
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:16: error: 'img' has not been declared
     for (auto &img : _data) {
                ^~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:27: error: qualified-id in declaration before ')' token
     for (auto &img : _data) {
                           ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:322:6: error: expected ';' before 'dataChanged'
     }
      ^
      ;
     emit dataChanged(this->index(0), this->index(_data.size() - 1));
          ~~~~~~~~~~~
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:324:34: error: expected ')' before ';' token
     updateLinkedListViewCurrent();
                                  ^
                                  )
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:9: note: to match this '('
     for (auto &img : _data) {
         ^
/root/WingGifEditor2/src/class/gifcontentmodel.cpp:320:5: error: expected iteration declaration or initialization
     for (auto &img : _data) {
     ^~~

你编译的qt是什么版本呢

5.15.2 和 6.6.2 和 6.7.3 。你这报错我就没见过了,就和不支持 for range 特性一样。😂

Reply View the author
kero990
deepin
2024-10-09 15:51
#16
寂静的羽夏

5.15.2 和 6.6.2 和 6.7.3 。你这报错我就没见过了,就和不支持 for range 特性一样。😂

换用clang编译成功了

src/settings/editorsettingdialog.h也需要加一个 #include

hex编辑器那个也是,用gcc就有一些报错,换clang就过了,不知道啥毛病。

另外,标题还是十六进制编辑器呢

=========================

按了半天空格发现没有空格播放

而且这个播放速度为什么这么鬼畜,基本上1秒播完了我5秒的动画

Reply View the author
寂静的羽夏
deepin
2024-10-09 18:26
#17
kero990

换用clang编译成功了

src/settings/editorsettingdialog.h也需要加一个 #include

hex编辑器那个也是,用gcc就有一些报错,换clang就过了,不知道啥毛病。

另外,标题还是十六进制编辑器呢

=========================

按了半天空格发现没有空格播放

而且这个播放速度为什么这么鬼畜,基本上1秒播完了我5秒的动画

给一个复现动画图呗,记录的问题(包括标题)我放到周末改。我用彩虹猫动画测试是正常的。空格播放和暂停动画我觉得确实更符合人的操作习惯。

Reply View the author
柠萌~
deepin
2024-10-10 21:51
#18

shamed like like

Reply View the author