以下方法中只有方法二为.NET调用,其它均为C++程序实现。

方法一:

利用OpenCV库中的imwrite函数或者cvSaveImage函数实现。

(1)    Imwrite

vector<int>CompressionPara;

CompressionPara.push_back(CV_IMWRITE_PNG_COMPRESSION);

CompressionPara.push_back(9); //参数越大,压缩比例越高

imwrite(pic1, SaveImgFront, CompressionPara);

(2)    cvSaveImage

int CompressionParams[3];

CompressionParams[0]= CV_IMWRITE_PNG_COMPRESSION;

CompressionParams[1]= 9;

cvSaveImage(saveSubName.c_str(), img, CompressionParams);

以上代码段重点在于函数的第3个输入参数,该参数用于调整压缩比例。

优点:代码易于管理,压缩比率可调整,不需要保存图片后再压缩,时间短。无损压缩。

缺点:压缩比例小,压缩后图片大概缩小为原图的90%左右。

方法二:

在C#端调用第三方压缩软件pngquant.exe,进行图片压缩。

string exepath = @"C:\Users\yf\Desktop\pngquant\pngquant.exe";

string path = @"C:\Users\yf\Desktop\pngquant\pic\";

DirectoryInfo dir = new DirectoryInfo(path);

FileInfo[] inf = dir.GetFiles();

foreach(FileInfo finf in inf)

{

if (finf.Extension.Equals(".png"))

{

System.Diagnostics.Process process = new System.Diagnostics.Process();

process.StartInfo.FileName= exepath;

process.StartInfo.CreateNoWindow = true;

process.StartInfo.UseShellExecute= false;

process.StartInfo.Arguments= " pngquant -f --ext .png --quality 20-50--speed 3 " + "\"" + dir.ToString() + finf.ToString() + "\"";

process.Start();

process.WaitForExit();

}

}

以上代码段重点在于调用exe时的传入参数,该参数指定了图片压缩后的质量(--quality)、压缩速度(--speed)、生成图片的扩展名(--ext)及需要处理的图片路径(“PATH”)。该软件压缩后的图片的位深度随着压缩质量和速度参数的变化而变化。

优点:压缩比率及速度均可以调整,较为灵活;参数适中时图片压缩的质量较好。

缺点:需要在客户端实现,不能融合进dll;图片需先生成在处理,耗时长。

方法三:

利用CxImage库进行图像压缩。

CxImage dst;

dst.Create(src1.size().width, src1.size().height, 8, CXIMAGE_FORMAT_BMP);

dst.SetXDPI(133);

dst.SetYDPI(133);

dst.SetStdPalette();

long i = 0, j = 0;

int height = src1.size().height;

int width = src1.size().width;

for (j = 0; j < height; j++)

{

for (i = 0; i < width; i++)

{

int watch1, watch2, watch3;

watch1 =src1.at<cv::Vec3b>(height - 1 - j, i)[0];

watch2 =src1.at<cv::Vec3b>(height - 1 - j, i)[1];

watch3 =src1.at<cv::Vec3b>(height - 1 - j, i)[2];

RGBQUAD c;

c.rgbBlue = watch1;

c.rgbGreen = watch2;

c.rgbRed = watch3;

dst.SetPixelColor(i, j, c);

}

}

以上代码段的重点在于双层for循环处,将PNG图片的三个通道颜色均转化为标准颜色库中的对应颜色。

优点:压缩比例较高;引入第三方库,实现较为简单。

缺点:图像压缩后易失真,对于噪声大的图片影响较为严重。

方法四:访问像素点进行压缩

直接使用内存访问图像像素点进行压缩。

void colorReduce8(cv::Mat &image, int div = 32)

{

int nl = image.rows;

int nc = image.cols;

//判断是否是连续图像,即是否有像素填充

if (image.isContinuous())

{

nc = nc*nl;

nl = 1;

}

int n =static_cast<int>(log(static_cast<double>(div)) / log(2.0));

uchar mask = 0xFF << n;

//遍历图像的每个像素

for (int j = 0; j<nl; ++j)

{

uchar *data =image.ptr<uchar>(j);

for (int i = 0; i<nc; ++i)

{

*data++ = *data &mask + div / 2;

*data++ = *data &mask + div / 2;

*data++ = *data &mask + div / 2;

}

}

}

以上代码段的重点在于双层for循环处,将PNG图片的颜色范围映射到一个更小的集合中,该方法压缩后的图片人为24位深度。

优点:位运算的计算速度快;压缩比例较高(与本身图片的质量有关)。

缺点:图像压缩后整体颜色偏暗。

【OpenCV】PNG图片压缩方法相关推荐

  1. Android应用开发中三种常见的图片压缩方法

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法private Bitmap comp ...

  2. 怎么压缩图片大小,图片压缩方法

    怎么压缩图片大小?工作中如果遇到一些体积较大的图片,尤其一些清晰度很高的图片,可能一张小尺寸的图片就有2-3M的大小,这个我们的使用打开造成很多的麻烦,例如因为超过限制大小而不能上传,打开的时候很大, ...

  3. OpenCV之图片预处理方法

    一.图片预处理 OpenCV系列-本文底页有多个常用方法链接 1.1 边界填充(padding) 方法 : cv2.copyMakeBorder BORDER_REPLICATE:复制法,也就是复制最 ...

  4. 图片压缩怎么做?这几种图片压缩方法很方便

    怎么把图片给压缩一下呢?图片的内存如果太大,那我们不管是在发送还是保存都会不方便.发送时会非常缓慢,保存时也占据很多内存,对本来空间就不太够的电脑或手机来说是一个致命问题.缓解这方面问题我们可以将图片 ...

  5. Android图片压缩方法总结

    本文总结Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 第一:质量压缩方法: ? 1 2 3 4 5 ...

  6. iOS 图片压缩方法

    两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGRepresentation(ima ...

  7. Excel 表格图片压缩方法

    我们在工作,学习当中少不了用Excel 来制作各式各样的表格,其中有很多使用技巧,来提高我们的工作效率.下面介绍在EXCEL中压缩图片的方法: 一.如果你在EXCEL工作表中插入比较大的图片,保存为文 ...

  8. 图片太大怎么改小kb?简单的图片压缩方法分享

    平时当我们在朋友圈分享一些有趣的照片或者使用图片素材进行上传的时候,经常遇到图片大小kb超出平台限制的情况,这时就无法正常上传了,遇到这种情况我们就需要想办法降低图片大小kb,那么有什么办法能够压缩图 ...

  9. 图片怎么压缩到200K以内,这3个图片压缩方法,简单有效

    你没有遇到过上传图片到网站的时候,图片太大不能上传的情况?还有,许多报名照片要求小于200K,可是照片超过这个大小,应该如何压缩呢?下面我给大家带来3个图片压缩的方法,既能快速压缩图片大小,又保存画质 ...

  10. 怎样改变照片大小?免费在线图片压缩方法

    平时我们经常会遇到一些线上申请资料需要上传证件照,一般我们会通过一些手机软件制作并下载适合规格的照片,但除了尺寸要求外,还会限制图片大小.如何才能既不改变图片原来的尺寸仅仅将照片压缩到100KB以下呢 ...

最新文章

  1. python爬虫实例-python爬虫实例大全
  2. 2016第三本《曾国藩的正面和侧面》
  3. mysql触发器 存储过程_mysql触发器和存储过程
  4. 【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现
  5. C++ wstring 与 string 之间的相互转换.
  6. 组态王能直接读取仪表数据吗_液晶多功能网络电力仪表PD800H
  7. 红橙Darren视频笔记 RecyclerView基本使用
  8. 联邦快递“误运”华为包裹遭调查 联邦快递:全力配合
  9. php对引用的简单理解
  10. iOS——Segue的使用
  11. 创建销售订单的BAPI
  12. E-mark认证是什么?
  13. Consider defining a bean of type ‘com.xingchen.media.service.MediaFileService‘ in your configuration
  14. 10.4 好老师就在你身边——《逆袭大学》连载
  15. 等保2.0测评综合得分计算
  16. Java小白的入门面试笔记--线程局部变量之灵魂四问
  17. 我的无影云电脑初体验
  18. 内蒙古大学计算机考研复试分数线,内蒙古大学2016年考研复试分数线
  19. 计算机程序必须具有硬盘才能工作吗,2016年3月计算机一级考试WPS试题及答案
  20. Joth the Ripper

热门文章

  1. 手机浏览器呼出QQ聊天窗口,微信内置浏览器呼出qq
  2. 六足仿生机器人的控制与实现
  3. MATLAB 线性动态范围调整
  4. 宜宾学院谢江宜计算机基础题,宜宾学院2011-2012学年度下期期末公共课考试安排表.xls...
  5. 【android】手把手轻松集成微信支付
  6. 看完还不会数据库优化,你来找我!
  7. Python学习week7_映射
  8. 电脑应用程序分身双开及多开(能记住账号和密码)
  9. What Is Harmony OS? Huawei’s New Operating System Explained
  10. UE4 全局变量的应用(蓝图)