Skip to content
This repository was archived by the owner on Dec 2, 2025. It is now read-only.

Commit 20f5178

Browse files
committed
perf(WidgetDisplay): 优化图像显示速度
* 将图片背景和前景分离,减少每次绘制工作量,增加图像显示速度 * 修复了单色位图中的调色板问题 * 修复BMP工厂类返回异常和异常无提示的问题 * 为主窗口添加了导出结果到文件的功能 ------
1 parent 2c696f1 commit 20f5178

File tree

15 files changed

+258
-167
lines changed

15 files changed

+258
-167
lines changed

docs/UML.mdj

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/BmpFile/src/BmpImage.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ BmpType BmpImage::getBmpFileType() const {
3838
case 1: return ONE_BIT;
3939
case 8: return EIGHT_BIT;
4040
case 24: return TWENTY_FOUR_BIT;
41-
default: return UNKNOWN_BIT;
41+
default:
42+
LOG(ERROR) << QString::asprintf("不支持的色深度:%d位", bmpInfoHeader.bitsPerPixel).toStdString();
43+
return UNKNOWN_BIT;
4244
}
4345
}

src/BmpFile/src/BmpImage1Bit.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,14 @@ void BmpImage1Bit::readImage(const std::string &filename) {
4949
LOG(ERROR) << "Not 1Bit Image." << std::endl;
5050
return;
5151
}
52-
bmpPixelInfo.palettes = new BmpColorPalette[2]{{0x00, 0x00, 0x00, 0x00},
53-
{0xff, 0xff, 0xff, 0x00}};
52+
53+
inputFile.seekg(sizeof(BmpFileHeader) + bmpInfoHeader.headerSize, std::ios::beg);
54+
bmpPixelInfo.palettes = new BmpColorPalette[2];
55+
memset(bmpPixelInfo.palettes, 0, sizeof(BmpColorPalette) * bmpInfoHeader.colors);
5456
bmpPixelInfo.paletteSize = 2;
57+
for (int i = 0; i < 2; i++) {
58+
inputFile.read(reinterpret_cast<char *>(bmpPixelInfo.palettes + i), sizeof(BmpColorPalette));
59+
}
5560

5661
inputFile.seekg(bmpFileHeader.offsetSize, std::ios::beg);
5762
bmpPixelInfo.bytePerLine = ((bmpPixelInfo.width + 7) / 8 + 3) / 4 * 4;
@@ -66,7 +71,7 @@ void BmpImage1Bit::readImage(const std::string &filename) {
6671
flag = true;
6772
continue;
6873
}
69-
bmpPixelInfo.pixels[i * bmpPixelInfo.width + k] = temp & 1 ? 0xFF : 0x00;
74+
bmpPixelInfo.pixels[i * bmpPixelInfo.width + k] = temp & 1 ? bmpPixelInfo.palettes[1].blue : bmpPixelInfo.palettes[0].blue;
7075
}
7176
if (flag) break;
7277
}

src/BmpFile/src/BmpImage8Bit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,6 @@ void BmpImage8Bit::readImage(const std::string &filename) {
7272

7373
void BmpImage8Bit::toQPixMap(QPixmap &pixmap) {
7474
const QImage qImage(bmpPixelInfo.pixels, bmpPixelInfo.width, bmpPixelInfo.height, bmpPixelInfo.width,
75-
QImage::Format_Indexed8);
75+
QImage::Format_Grayscale8);
7676
pixmap = QPixmap::fromImage(qImage);
7777
}

src/Factory/src/BmpFactory.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <BmpImage1Bit.h>
1414
#include <BmpImage24Bit.h>
1515
#include <BmpImage8Bit.h>
16+
#include <QMessageBox>
1617
#include <glog/logging.h>
1718

1819
BmpImage *BmpFactory::createBmpImage(const std::string &filepath) {
@@ -26,6 +27,7 @@ BmpImage *BmpFactory::createBmpImage(const std::string &filepath) {
2627
case TWENTY_FOUR_BIT:
2728
return new BmpImage24Bit();
2829
case UNKNOWN_BIT:
30+
QMessageBox::warning(nullptr, "无法加载图片", "不支持的BMP文件格式");
2931
LOG(ERROR) << "未知的bmp文件格式" << std::endl;
3032
return nullptr;
3133
}

src/Qt/include/ImageDisplay.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,18 @@ namespace QT {
5151

5252
void drawPath();
5353

54-
private:
55-
void paintEvent(QPaintEvent *event) override;
54+
protected:
55+
void updateShowImage(QPainter &painter) override;
5656

57-
void checkRangeLimit(QPointF &point) const;
5857

59-
void mousePressEvent(QMouseEvent *event) override;
58+
private:
59+
void checkRangeLimit(QPoint &point) const;
6060

61-
void drawMap(QPainter &painter);
61+
void mousePressEvent(QMouseEvent *event) override;
6262

6363
std::vector<Point> points;
64-
QPointF start;
65-
QPointF end;
64+
QPoint start;
65+
QPoint end;
6666
int status = 0;
6767
Ui::ImageDisplay *ui;
6868
SearchThread *thread = nullptr;

src/Qt/include/MainWindow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ namespace QT {
2525

2626
void findPath();
2727

28+
void saveImage();
29+
2830
signals:
2931
void searchPathSignal(PathSearchMethod);
3032

src/Qt/include/WidgetDisplay.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,14 @@ class WidgetDisplay : public QWidget {
4646

4747
[[nodiscard]] QPointF getLocate(const QPointF &pos) const;
4848

49+
[[nodiscard]] QPoint getLocatePoint(const QPointF &pos) const;
50+
4951
void paintGrid(QPainter &painter) const;
5052

5153
void drawPixel(QPainter &painter, const QPointF &point, QColor color) const;
5254

55+
virtual void updateShowImage(QPainter &painter);
56+
5357
size_t imageWidth = 0;
5458
size_t imageHeight = 0;
5559
float widthPerPix = 4;
@@ -58,7 +62,9 @@ class WidgetDisplay : public QWidget {
5862
bool leftMousePressed = false;
5963
QPointF preMousePos;
6064
QPointF nowMouseImagePos;
61-
QPixmap currentImage;
65+
QPixmap backGroundImage;
66+
QPixmap showImage;
67+
bool keepStatic = false;
6268
};
6369

6470
#endif //WIDGETDISPLAY_H

src/Qt/src/GenerateDisplay.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ namespace QT {
2222
ui->setupUi(this);
2323
imageHeight = 50;
2424
imageWidth = 50;
25-
currentImage = QPixmap(imageWidth, imageHeight);
26-
currentImage.fill(Config::getInstance()->getConfigField(WALL_COLOR));
25+
backGroundImage = QPixmap(imageWidth, imageHeight);
26+
backGroundImage.fill(Config::getInstance()->getConfigField(WALL_COLOR));
2727
adjustZoom();
2828
}
2929

@@ -45,7 +45,7 @@ namespace QT {
4545
thread = new GenerateThread(imageHeight, imageWidth, method);
4646
connect(thread, &GenerateThread::threadFinishSignal, [this] {
4747
result = std::move(thread->getResult());
48-
currentImage = result.toQPixmap();
48+
backGroundImage = result.toQPixmap();
4949
update();
5050
});
5151
QThreadPool::globalInstance()->start(thread);

src/Qt/src/GenerateMaze.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,10 @@ namespace QT {
4040
}
4141
switch (ui->saveTypeComboBox->currentIndex()) {
4242
case 0: ui->image->saveImage(filePath, QImage::Format_Mono);
43-
break;
44-
case 1: ui->image->saveImage(filePath, QImage::Format_Indexed8);
45-
break;
43+
break;
44+
case 1: ui->image->saveImage(filePath, QImage::Format_Grayscale8);
45+
break;
4646
case 2: ui->image->saveImage(filePath, QImage::Format_RGB888);
47-
break;
48-
default: return;
4947
}
5048
}
5149

0 commit comments

Comments
 (0)