打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
图片数据的扫描处理
一:单色图的扫描处理(本程序可以实现图片的透明化处理)
透明化处理思路:先得到图片的每个像素的数据,之后再根据数据重新绘制。
1,首先被扫面的图片必须为单色(0:表示黑色;1表示白色); 
QImage newImage(width,height,QImage::Format_Mono); //高度、宽度、单色图片
2,使用QImage的scanline()函数得到每一行的首地址,再根据首地址即可得到图片的每一个字节的数据(注意:图片的数据是按字节存储);
3,图片的重新绘制(略)
代码注释
1,读取数据部代码
QImage image(imagePath);  //根据图片路径,加载出图片
            int row=0;  //图片横向的字节数
            row=image.width()/8; //得到图片的横向的字节数
            if(image.width()%8)  //如果字节数超过完整的字节,则字节增加1
            {
               row++;
            }

            unsigned char buf[32][32]={1}; //定义存储数据的数组
            unsigned char *buffer; //临时变量
            for(int i=0;i
            {
                buffer=image.scanLine(i); //得到该行的首地址
                for(int j=0;j
                {
                    buf[i][j]=*buffer++;
                    qDebug()<"image><>
                }
2,重新绘制图片的函数代码
 QPixmap pix=QPixmap(image.width(),image.height()); //根据图片的宽度和高度,新建一个图片
            pix.fill(Qt::transparent); //设置图片背景透明
            QPainter p(&pix); //定义画家
            unsigned char d;
            for(int i=0;i
            {
                for(int j=0;j
                {
                    d=buf[i][j];
                    for(int k=0;k<8;k++)>
                    {
                       if((d&0x80)==0x80) //如果该位为黑点,则绘制,否则不绘制
                          p.fillRect( QRect(k+j*8,i,1,1), Qt::black);
                          d<>
                    }
                }
            }

二:其他类型的图片的扫描处理
1,首先得到待处理图片的某个像素点的数据,之后再得到某个分量的数据;
2,对数据进行相应的处理后就可以得到需要的数据;
代码注释详解
QColor pix;  //存储耨个像素的数据
int blackValue=0; //像素数据的黑色分量
unsigned char t=0;  //中间变量
for(int i=0;i
{
 for(int j=0;j
  {
   for(int k=0;k<>
    {
​       if((j*8+k)>=image.width()) //可以解决坐标超出问题,QImage::setPixel: coordinate () out of range
        {
           continue;
         }
     pix=image.pixel(j*8+k,i);  //得到每个像素点的数据
     blackValue=pix.black();  //得到像素点的黑色分量值
     if(blackValue>127)
       {
        setBits(t,1,k);  //设置相应的数据位
        }
      else
        {
        setBits(t,0,k); //设置相应的数据位
        }
    }
      buf[i][j]=t; //得到整个字节的数据
      t=0;
   }
}

//设置数据位的子函数
//参数解释:t 存储一个字节的数据 
value:需要设置的数据
bit:需要设置的数据位
setBits(unsigned char &t,int value,int bit)
{
    if(value)
    {
        t|=(0x80>>bit);  //将相应的数据位置1
    }
    else
    {
        t&=~(0x80>>bit);  //将相应的数据位清0
    }
}

​三:图片类常用的函数
​1,图片镜射函数:QImage QImage::mirrored(bool horizontal = false, bool vertical = true) const
​参数:横向镜射和纵向镜射
​2,图片反色函数:

​四:透明相关
​1,将图片的的数据读出来,进行相应的处理,再重新绘制上去。
​2,在绘制直线时,可以设置直线的线宽设置成小于1的数就可以使用绘制的内容透明,QPen pen;pen.setWidthF(0.5);
 上面的线的宽度为0.5,下面的为1。
A line width of zero indicates a cosmetic pen. This means that the pen width is always drawn one pixel wide,
​我的个人理解:Qt的画笔,至少是绘制一个像素点,当画笔的宽度设置的值小于1时,此时的画笔就是化妆笔。


五:打印相关,单色图(QBitmap)
​需要打印时使用QBitmap处理会更好,会使得图片的效果更好
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
YUV422转RGB24
bayer, yuv, RGB转换方法
C语言符号意义大全
qt控件的使用
单片机C语言学习
ppm图像格式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服