• qt-QImage


    图像的数据是以字节为单位保存的,每一行的字节数必须是4的整数倍,不足的补0;
    如果不是整数倍,则根据公式: W = ( w * bitcount + 31 )/32 * 4;
    注: w是图像的宽度,bitcount是图像的位深,即32、24等, 计算得到的W是程序中图像每行的字节数;这里讲述QImage的32、24、8位图
    图像格式:QImage::Format_RGB32(32位) 
        QImage::Format_RGB888(24位)
        QImage::Format_Indexed8(8位)

    QImage myImage1 = QImage("./ma.jpg");  //根据文件名打开图像,如果图像本身是32、24位的,程序中图像是32位的,如果图像本身是8位、1位的,程序中对应为8位、1位
    QImage myImage2 = QImage(200, 200, QImage::Format_RGB32);// 根据图像宽高来构造一幅图像
    /*
    参数1和参数2:图像的宽高
    参数3:图像格式
        QImage::Format_RGB32   存入格式为B,G,R,A 对应 0,1,2,3
        QImage::Format_RGB888   图像使用24位RGB格式(8-8-8)存储    存入格式为R, G, B 对应 0,1,2
    */
    QLabel* label=new QLabel(this);
    label->move(10,10);
    label->resize(300,300);
    
    QLabel* label1=new QLabel(this);
    label1->move(650,10);
    label1->resize(300,300);
    
    int n=myImage1.sizeInBytes();  //图像的总字节数
    n=myImage1.bytesPerLine();  //图像每行字节数
    
    uchar* pc=myImage1.bits(); //返回图像首地址--第一个像素的地址
    uchar* ph=myImage1.scanLine(0); //返回指定行首地址
    
    int j=0;
    int b_32=ph[j*4+0];  //返回指定行的j列像素所对应的B值--32位图
    int g_32=ph[j*4+1];  //返回指定行的j列像素所对应的G值--32位图
    int r_32=ph[j*4+2];  //返回指定行的j列像素所对应的R值--32位图
    int a_32=ph[j*4+3];  //返回指定行的j列像素所对应的A值--32位图
    
    QSize s=myImage1.size();  //返回图像的大小
    n=myImage1.width(); //返回图像的宽
    n=myImage1.height(); //返回图像的高
    
    
    
    
    QPoint po(200,150);
    bool b=myImage1.valid(po);  //如果指定点是图像中有效的坐标,则返回true;否则返回false。
    b=myImage1.valid(100,40);  //如果指定点是图像中有效的坐标,则返回true;否则返回false。
    
    QRect r=QRect(200,200,300,400);
    QImage im2=myImage1.copy(r);  //复制指定区域的图像
    
    n=myImage1.depth();  //返回图像的深度
    //32
    
    //myImage1.fill(Qt::white);  //用指定颜色填充图像
    
    s=QSize(200,200);
    im2=myImage1.scaled(s);  //缩放图像
    /*
        参数2:可选
        IgnoreAspectRatio 默认 矩形框有多大,图片就缩放成多大,不限制原图片的长宽比
         KeepAspectRatio    保持原图片的长宽比,且不超过矩形框的大小
         KeepAspectRatioByExpanding   根据矩形框的大小最大缩放图片
         参数3:可选
         Qt::FastTransformation  默认  转换快速执行,没有任何平滑处理
         Qt::SmoothTransformation   使用双线性滤波对生成的图像进行转换
         */
    
    //scaledToHeight    根据高度缩放
    //scaledToWidth     根据宽度缩放
    
        QTransform tf;  //坐标变换
        tf.rotate(30.5,Qt::YAxis);
        //参数1:旋转角度
        //参数2:旋转轴   Qt::XAxis    Qt::YAxis   Qt::ZAxis默认
    
        QImage im3=im2.transformed(tf,Qt::FastTransformation); //返回旋转后的图像
            /*
        参数1:旋转角度  正数:顺时针     负数:逆时针
        参数2:Qt::FastTransformation  默认  变换执行迅速,无需平滑
            Qt::SmoothTransfor               利用双线性滤波对得到的图像进行变换
            */
    
    //修改像素
    /*Qt中,QRgb是unsigned int的别名*/
        QRgb red = qRgba(255, 0, 0, 255);  //表示纯红色,不透明
        //RGBA:(32位)
    int width=im2.width();
    int height=im2.height();
    for(int i=0;i<width;++i){
        for(int j=0;j<height/2;++j){
            //im2.setPixel(i,j,red); //给指定点设置像素
            //参数1:行号
            //参数2:列号
            //此函数修改大量像素值的效率必然是极低的
        }
    }
    
    QPixmap p;
    p.convertFromImage(myImage1);  //把QImage转换成QPixmap
    label->setPixmap(p);
    label->adjustSize();
    
    
    QPixmap p1;
    p1.convertFromImage(im2);
    label1->setPixmap(p1);
    label1->adjustSize();
    
    
    qDebug()<<b_32;
    qDebug()<<n;

  • 相关阅读:
    排序总结[3]_线性排序算法
    Spring九问
    DP-最大递增子序列与最大递增子数组; 最大公共子序列与最大公共子数组。
    java 8 新特性
    数据库事务隔离等级
    算法思维方式之二——DP与DFS
    算法思维方式—— 由排列组合想到的
    java Servlet简介
    java hashCode, 引用以及equals().
    java反射简介
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13693487.html
Copyright © 2020-2023  润新知