C++ Qt 高分屏处理心得

C++ Qt 高分屏处理心得

首先自我介绍一下, 本人从事c++ qt方向的画面开发,工作内容主要是im pc端相关,接下来和大家分享一些经验之谈,希望可以帮助到有需要的同学。
今天为大家分享的是C++ Qt处理高分屏的一些心得。

在正文之前先为小白分享一些关于高分屏的知识,大神请自行略过…

  1. 高分屏就是在同样大小的屏幕面积上显示更多的像素点,也就是更多的可视信息。(摘自百度百科)
  2. DPI。即Dots Per Inch,它表示每英寸的像素点数。经常用来衡量高分屏。
    以上. 高分屏即高DPI屏。

一、Qt提供的高分屏处理

Qt::AA_EnableHighDpiScaling 这个QApplication的属性可以适用于80%的场景。

int main(int argc, char *argv[]) 
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
   QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QApplication a(argc, argv);
    return a.exec();
}	

重点1: 一定要在QApplication初始化之前使用。
重点2: Qt5.6+ 版本可以使用
更多相关知识请查看 Qt官方高DPI文档.

二、根据实际需求计算屏幕DPI

在某些情况下,Qt自带的处理方式并不能满足我们的实际需求,so 我们需要自己计算屏幕的DPI,当然Qt也提供了相关的接口(QScreen::physicalDotsPerInch)。

	// 本代码计算的是主屏的dpi 
	// 获取主屏
	QScreen* sreen = QGuiApplication::primaryScreen();
	// 获取DPI
	qreal dpi = sreen->physicalDotsPerInch();

当然如果不想也可以使用windows API 。

desktopDc = GetDC(NULL); // 获取屏幕
horizontalDPI = GetDeviceCaps(desktopDc, LOGPIXELSX); // 横向DPI
verticalDPI = GetDeviceCaps(desktopDc, LOGPIXELSY); // 纵向DPI

三、应用于高分屏图片处理

在之前的一篇文章中我介绍了基于C++ Qt的圆角头像处理. 文章中虽然解决了圆角头像问题,但是在高分屏下就会很模糊,下面我介绍一下如何解决这个问题。

  1. 首先我们利用上面第二点(根据实际需求计算屏幕DPI)中的方法获取屏幕的DPI。
  2. 我们对屏幕进行一个简单的分类,分为普通屏、2K屏幕、3K屏、4K屏。
  3. 根据不同的类别的屏幕我们生成一个n最终压缩尺寸的图片。
    比如我们想要使用2K屏展示一个50
    50的图片,我比如我们想要使用2K屏展示一个5050的图片,我们将生成一张100100(2*50) 的图片。
  4. 使用QPainter将图片描画为一个最终尺寸的图片。
    // 获取是几K的屏
    int qimage::dpi() {

        if(_dpi != 0)
            return _dpi;

        QScreen* sreen = QGuiApplication::primaryScreen();
        int dpi = (int)sreen->physicalDotsPerInch();

        if(dpi <= 100)
            _dpi = 1;
        else if(dpi <= 120)
            _dpi = 2;
        else if(dpi <= 144)
            _dpi = 3;
        else
            _dpi = 4;
        return _dpi;
    }
    
	// 生成显示图片 生成圆角图片可以参考我上篇文章
	int dpi = qimage::instance().dpi();
	// 加载图片
    QPixmap pixmap = qimage::instance().loadPixmap(_imagePath, true, true, _radius * 2 * dpi);

    if(!pixmap.isNull())
    {
        QPainter painter;
        painter.begin(this);
        painter.setRenderHints(QPainter::Antialiasing, true);
        painter.setRenderHints(QPainter::SmoothPixmapTransform, true);
        QPainterPath path;
        QRect headRect(0, 0, _radius * 2, _radius * 2);
        path.addEllipse(headRect);
        painter.setClipPath(path);
        painter.drawPixmap(headRect, pixmap);
        painter.end();
    }

如有更好的方法欢迎留言讨论。

— 本文章为原创文章,如需转载请标明出处。—

你可能感兴趣的:(图片处理)