59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
#include "depth/DepthService.h"
|
||
|
||
#include <algorithm>
|
||
|
||
namespace core {
|
||
|
||
QImage DepthService::computeFakeDepth(const QSize& size) {
|
||
if (size.isEmpty() || size.width() <= 0 || size.height() <= 0) {
|
||
return {};
|
||
}
|
||
QImage depth(size, QImage::Format_Grayscale8);
|
||
if (depth.isNull()) {
|
||
return {};
|
||
}
|
||
depth.fill(0);
|
||
return depth;
|
||
}
|
||
|
||
QImage DepthService::computeFakeDepthFromBackground(const QImage& background) {
|
||
if (background.isNull()) {
|
||
return {};
|
||
}
|
||
return computeFakeDepth(background.size());
|
||
}
|
||
|
||
QImage DepthService::depthToColormapOverlay(const QImage& depth8, int alpha) {
|
||
if (depth8.isNull()) {
|
||
return {};
|
||
}
|
||
const QImage src = (depth8.format() == QImage::Format_Grayscale8) ? depth8 : depth8.convertToFormat(QImage::Format_Grayscale8);
|
||
if (src.isNull()) {
|
||
return {};
|
||
}
|
||
|
||
const int a = std::clamp(alpha, 0, 255);
|
||
QImage out(src.size(), QImage::Format_ARGB32_Premultiplied);
|
||
if (out.isNull()) {
|
||
return {};
|
||
}
|
||
|
||
for (int y = 0; y < src.height(); ++y) {
|
||
const uchar* row = src.constScanLine(y);
|
||
QRgb* dst = reinterpret_cast<QRgb*>(out.scanLine(y));
|
||
for (int x = 0; x < src.width(); ++x) {
|
||
const int d = static_cast<int>(row[x]); // 0..255
|
||
// depth=0(远)-> 蓝;depth=255(近)-> 红
|
||
const int r = d;
|
||
const int g = 0;
|
||
const int b = 255 - d;
|
||
dst[x] = qRgba(r, g, b, a);
|
||
}
|
||
}
|
||
|
||
return out;
|
||
}
|
||
|
||
} // namespace core
|
||
|