首页 > 其他分享 >QT: QImage::bits()访问图像出现数据错位

QT: QImage::bits()访问图像出现数据错位

时间:2024-12-13 15:59:01浏览次数:5  
标签:nImageWidth QT int image nBytesPerPixel bits 像素点 QImage

问题:

        在解析bmp图片时,使用QImage::bits()拿到第一个像素点的数据,依次访问像素点数据时,发现图像数据错位现象。

原因:

        经查询应该为QImage读取bmp图像时,每行的像素点所占内存需为4字节的倍数,所以按照图像的长和宽以及深度,按字节依次读取会出现错位现象。

解决方案:

         更改为按行读取,依次获取每行第一个像素点。

示例:

QImage image("test1.bmp");
if (image.format() != QImage::Format_Grayscale16)
{
    image.convertTo(QImage::Format_Grayscale16);
}
const char* pImageData = (char*)image.bits();
int nImageWidth = image.width();
int nImageHeight = image.height();
int nBytesPerPixel = image.depth() / 8;

// 按照如下方式读取,当每行像素所占内存非4字节倍数时,发生数据错位
//QByteArray bytesArray(pImageData, nImageWidth * nImageHeight * nBytesPerPixel);

// 更改如下方式读取,轮询获取每行首个像素点
QByteArray bytesArray;
bytesArray.resize(nImageWidth * nImageHeight * nBytesPerPixel);
int index = 0;
for (int y = 0; y < nImageHeight; ++y) {
    char* line = reinterpret_cast<char*>(image.scanLine(y));
    for (int x = 0; x < nImageWidth * nBytesPerPixel; ++x) {
        bytesArray[index] = line[x];
        index++;
    }
}

const QImage temp((const uchar*)bytesData.data(), nImageWidth, nImageHeight, nImageWidth * nBytesPerPixel, QImage::Format_Grayscale16);
const m_imageThumb = temp.copy();
m_imageThumb .save("output.bmp");

标签:nImageWidth,QT,int,image,nBytesPerPixel,bits,像素点,QImage
From: https://blog.csdn.net/qq_42108961/article/details/144451944

相关文章

  • QT日志类SimpleQtLogger的简单记录
    在现代软件开发中,日志记录是必不可少的部分。它不仅帮助开发者在调试和维护软件时了解程序的运行状态,还能提供关键的错误信息。对于使用Qt框架开发应用程序的开发者来说,选择一个合适的日志库至关重要。本文将详细介绍Qt日志库SimpleQtLogger的特点、安装方法、使用示例以及它在实......
  • HDLBits-Verilog:Clock
    Youareprovidedamodulewiththefollowingdeclaration:moduledut(inputclk);Writeatestbenchthatcreatesoneinstanceofmoduledut(withanyinstancename),andcreateaclocksignaltodrivethemodule'sclkinput.Theclockhasaperi......
  • windows 安装mqtt服务器 mosquitto
    一、安装搭建一个mqtt服务器,这里我们采用mosquitto1、下载地址:https://mosquitto.org/download/ 2、选择windows:https://mosquitto.org/files/binary/win64/mosquitto-2.0.18-install-windows-x64.exe 3、右键安装即可默认的安装路径在这里:C:\ProgramFiles\mosquitto......
  • qt学习之事件
    事件经过:事件派发(QApplication调用notify())->事件过滤(eventFilter())->事件分发(窗口事件分发器event())->事件处理(事件处理器函数,鼠标事件,键盘事件,绘图事件)以上函数由qt控件维护,会在合适的时机执行,是虚函数可以重写。两张蝴蝶图片实现飞舞效果//.h文件#ifndefBUTTERFLY_......
  • qt激光加工软件开发——日志模块
    本篇主要介绍该加工软件的日志模块实现的功能:主界面日志栏显示分级显示本地保存简单的调用机制目前选择的是qInstallMessageHandler,毕竟是qt亲儿子(Qt5.0以上版本)QMutex保证线程安全消息的格式化,目前主要是debug与warning,主页面显示会做颜色区分信号logMes......
  • Qt之点击鼠标右键创建菜单栏使用(六)
    Qt开发 系列文章-menu(六)目录前言一、示例演示二、菜单栏1.MenuBar2.Menu总结前言QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(statusbar)及一个中心部件(centralwidget),是许多应用程序的基础。今天本文......
  • Qt,设置软件字体
      //一、设置全局字体(系统库字体)QFontfont("Courier",10,QFont::Normal,false);a.setFont(font);//二、设置全局字体(自定义字体)intfont_id=QFontDatabase::addApplicationFont(QStringLiteral(":/static/font/FormaDJRMicro-Regular.ttf"));QStringfont_name......
  • kali下qt无法使用中文输入法解决方案
    1.如果使用的apt安装的designer-qt6等的一些工具,则使用如下方案aptinstallfcitx5-frontend-qt6如上就可解决,如果用的qt5,就安装fcitx5-frontend-qt5 2.使用qt在线安装的dpkg-Lfcitx5-frontend-qt6查看安装路径找到libfcitx5platforminputcontextplugin.so这个文件......
  • Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控
    一、前言用ffmpeg做硬解码开发,参考自带的示例hw_decode.c即可,里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码,也就是无需区分用的何种显卡,操作系统自动调度,基本上满足了各种场景的需要,这种方式很通用也便捷,但是一些特殊场景必须要用指定硬解码器名称的方式,比如指定......
  • QT自定义控件实践--滑动组件
    概述             本篇文章,会逐步带您了解,如何自定义一个QT的滑动组件操作步骤选择合适的基类继承:我们命名这个自定义控件为MySlipButton,继承自QWidget添加成员变量:根据滑动组件的特性,添加合适的成员变量,如当前值、最小值、最大值、滑块的位置等。......