精华内容
下载资源
问答
  • symbian 图片有损压缩

    2011-05-15 00:54:50
    symbian 图片有损压缩,生成缩略图。
  • 查阅JPEG编码的有关资料,对图像进行JPEG压缩,算法步骤必须包括如下几个部分:图像分块,离散余弦变换,量化,ac和dc系数的Z字形编排。 问题1: 质量因子分别选为20,60,80,对比显示原图与不同质量因子下解码后的...
  • 求助:希望各位大神给提供图片有损压缩和无损压缩的源代码(C++)。我最近在做图片压缩的程序,但是不太会,希望各位大神给点指导。
  • 图像有损压缩与无损压缩Lossy and lossless compression are two kinds of data compression techniques. Here in this article, you will get to learn about what is lossy and lossless compression, their ...

    图像有损压缩与无损压缩

    Lossy and lossless compression are two kinds of data compression techniques. Here in this article, you will get to learn about what is lossy and lossless compression, their differences, and uses.

    有损和无损压缩是两种数据压缩技术。 在本文的此处,您将了解什么是有损和无损压缩,它们的区别和用途。

    So, let’s start with the basics.

    因此,让我们从基础开始。

    什么是数据压缩? (What is Data Compression?)

    Data compression is the process of diminishing the storage size of any data or file so that it consumes less space on the disk. It is the technique of modifying, restructuring, encoding and converting the schema or instance of any data to reduce its size.

    数据压缩是减小任何数据或文件的存储大小,以使其在磁盘上占用较少空间的过程。 它是一种修改,重组,编码和转换任何数据的模式或实例以减小其大小的技术。

    In simple words, it is converting the file in such a way that its size is reduced to a maximum extent. Data compressions is also known as bit-rate reduction or source coding.

    简而言之,它将以最大程度减小文件大小的方式转换文件。 数据压缩也称为比特率降低或源编码。

    Check the diagram below:

    检查下图:

    Data-compression

    An example of an image that is converted or compressed to reduce its size without losing the ability to reconstruct the image.

    转换或压缩以减小其尺寸而又不损失重建图像能力的图像的示例。

    Now, the question here is why there is a need for data compression?

    现在,这里的问题是为什么需要数据压缩?

    There are two primary reasons for the same.

    造成这种情况的主要原因有两个。

    • Storage – it helps in reducing the size of data that is required to store it on the disk

      存储–它有助于减少将数据存储在磁盘上所需的数据量

    • Time – saves time in data transmission as the size is reduced to an extent

      时间–尺寸减小到一定程度,节省了数据传输时间

    You are getting the point!

    您明白了!

    Now coming back to the main topic, there are mainly two types of data compression techniques. Let’s discuss them.

    现在回到主要主题,主要有两种类型的数据压缩技术。 让我们讨论一下。

    数据压缩技术 (Data Compression Techniques)

    Data-compression-techniques

    有损压缩 (Lossy Compression)

    Lossy compression is a technique that involves the elimination of a specific amount of data. It helps in reducing the file size to a great extent without any noticeable thing. Also, once the file is compressed, it cannot be restored back to its original form as the data from the file is significantly reduced. This technique is much more useful when the quality of the file is not essential. Additionally, it helps to save much space on the disk to store the data.

    有损压缩是一种涉及消除特定数量数据的技术。 它有助于在没有任何明显注意的情况下大大减小文件大小。 同样,一旦压缩了文件,由于来自文件的数据将大大减少,因此无法将其恢复为原始格式。 当文件的质量不是很重要时,此技术会更加有用。 此外,它有助于节省磁盘上的大量空间来存储数据。

    Lossy compression is not useful when the quality of the file is essential. Besides, if there’s any further analysis to be processed on the record, this method is not ideal. This method is generally used for audio and video compression, where there is a significant amount of data loss, and even users cannot recognize it.

    当文件的质量至关重要时,有损压缩是没有用的。 此外,如果记录上有任何进一步的分析要处理,这种方法也不理想。 此方法通常用于音频和视频压缩,这会导致大量数据丢失,甚至用户也无法识别它。

    Example of lossy compression: JPEG image

    有损压缩的示例:JPEG图像

    lossy-compression

    Image Source

    图片来源

    “Compressed image (left) shows blocking artifacts compared to the original image (right) as a result of the JPEG compression scheme used.”

    “由于使用了JPEG压缩方案,与原始图像(右)相比,压缩图像(左)显示出块状伪影。”

    无损压缩 (Lossless Compression)

    Lossless compression is a technique that involves only a certain amount of elimination of data. This technique also helps in reducing the file size, but not to the greater extent as that of lossy compression. Instead, in this method, if the file is compressed, it can be restored back to its original form. Further, the quality of the data is not compromised; hence, the reduction in size is not much.

    无损压缩是一种仅涉及消除一定量数据的技术。 此技术还有助于减小文件大小,但不会像有损压缩那样在很大程度上。 相反,在这种方法中,如果文件被压缩,则可以将其还原回其原始形式。 此外,数据的质量不会受到影响; 因此,尺寸减小不多。

    Lossless compression is not useful when you want reduced size for extra storage. Also, if there is any further analysis to be performed on the file, lossless compression is not beneficial. It is useful for maintaing the originality of files by eliminating only unwanted data. This technique is commonly used for text files, sensitive documents, and confidential information.

    当您希望减小尺寸以增加存储空间时,无损压缩将无用。 此外,如果要对文件执行任何进一步的分析,则无损压缩将无益。 通过仅消除不需要的数据,对于保持文件的原始性很有用。 此技术通常用于文本文件,敏感文档和机密信息。

    Example of lossless compression: PNG image

    无损压缩示例:PNG图像

    lossless-compression

    Image Source

    图片来源

    “The original image (left) is identical to the compressed image (right). It is represented by the identical graphs at the bottom that show the grey values for the pixels in each column is the same between the two images.”

    “原始图像(左)与压缩图像(右)相同。 它由底部的相同图形表示,该图形显示两列图像中每列像素的灰度值相同。”

    有损压缩与无损压缩之间的区别 (Difference between Lossy and Lossless Compression)

    BasisLossy CompressionLossless Compression
    DefinitionLossy compression is a technique that involves the elimination of a specific amount of data. It helps in reducing the file size to a great extent without any noticeable thingLossless compression is a technique that involves only a certain amount of elimination of data. This technique also helps in reducing the file size, but not to the greater extent
    Compression RatioHighLow
    File QualityLowHigh
    Elimination of DataEven the necessary data is also removed which isn’t noticeableOnly some specific amount of unwanted data is removed
    RestorationCannot restore its original formCan restore its original form
    Loss of InformationThis technique involves some loss of informationThis technique doesn’t include any loss of information
    Data AccommodationMore data accommodationLess data accommodation
    DistortionFiles are distortedNo distortion
    Data holding capacityMoreLess
    Algorithms UsedTransform coding, DCT, DWT, fractal compression, RSSMSRLW, LZW, Arithmetic encoding, Huffman encoding, Shannon Fano coding
    File TypesJPEG, GIF, MP3, MP4, MKV, OGG, etc.RAW, BMP, PNG, WAV, FLAC, ALAC, etc.
    基础 有损压缩 无损压缩
    定义 有损压缩是一种涉及消除特定数量数据的技术。 它有助于在没有任何明显注意的情况下大大减小文件大小 无损压缩是一种仅涉及消除一定量数据的技术。 此技术还有助于减小文件大小,但不会在更大程度上
    压缩率
    档案品质
    消除数据 即使必要的数据也被删除,这并不明显 仅删除了特定数量的有害数据
    恢复 无法恢复其原始形式 可以恢复其原始形式
    信息丢失 此技术涉及一些信息丢失 此技术不包括任何信息丢失
    数据调整 更多数据住宿 数据容纳量减少
    失真 文件变形 无失真
    资料储存能力 更多
    使用的算法 变换编码,DCT,DWT,分形压缩,RSSMS RLW,LZW,算术编码,霍夫曼编码,香农法诺编码
    文件类型 JPEG,GIF,MP3,MP4,MKV,OGG等 RAW,BMP,PNG,WAV,FLAC,ALAC等

    使用哪个? (Which One to Use?)

    Although both are the types of data compression, each can be useful under different situations. Like, lossy compression helps in reducing the file size, which means it is helpful to those who have vast amounts of data stored on the database. So, this technique is useful in storing the data with a much-diminished size. Also, for webpages files of such lower size is beneficial for faster loading.

    尽管这两种都是数据压缩的类型,但是每种压缩在不同情况下都是有用的。 像,有损压缩有助于减小文件大小,这对那些在数据库上存储大量数据的用户有帮助。 因此,此技术在存储大小减小的数据时很有用。 同样,对于网页而言,这种较小的文件有利于更快地加载。

    Further, this process doesn’t allow any after analysis of the data once the compression is completed. Also, the file cannot be restructured in its original form as it involves the loss of data.

    此外,压缩完成后,此过程将不允许对数据进行任何后续分析。 同样,该文件不能以其原始形式进行重组,因为它涉及数据丢失。

    Unlike lossy compression, lossless compression doesn’t involve any loss of data. Neither the quality of data is compromised, nor the size of data is excessively reduced. It keeps the original format so it can be restored, and further operation can be performed. This method is helpful for those who need to access the data back again without compromising its quality.

    与有损压缩不同,无损压缩不涉及任何数据丢失。 既不会损害数据质量,也不会过度减少数据大小。 它保留了原始格式,因此可以还原,并且可以执行进一步的操作。 此方法对需要再次访问数据而不影响其质量的用户很有用。

    最后的话 (Final Words)

    Both lossy compression and lossless compression helps in the compression of data in their unique way. While lossy compression is useful to store data by compromising the data, lossless compression doesn’t. Lossless compression technique is beneficial for maintaing the originality of data, and lossy compression, on the other hand, doesn’t. Both the methods are helpful in database management, to identify and compress files accordingly.

    有损压缩和无损压缩都以其独特的方式帮助压缩数据。 尽管有损压缩通过破坏数据来存储数据很有用,但无损压缩却没有。 无损压缩技术有利于保持数据的原始性,而无损压缩则不能。 两种方法都有助于数据库管理,从而相应地识别和压缩文件。

    If there’s any other query regarding data compression or both the techniques of data compression, then let us know in the comment box below.

    如果还有关于数据压缩或这两种数据压缩技术的任何其他查询,请在下面的注释框中告知我们。

    翻译自: https://www.thecrazyprogrammer.com/2019/12/lossy-and-lossless-compression.html

    图像有损压缩与无损压缩

    展开全文
  • 包含正逆运算,用到dct2函数。 其中算法步骤如下: (1)Subtract the image intensity by 128. (2)Partition the input image into 8x8 blocks (3)Apply DCT to each 8x8 block .......
  • 图像有损压缩与无损压缩Modern web browsers accept four image formats by default: JPEG, GIF, PNG and SVG. But before talking about formats, let’s introduce two extremely important terms: lossless and ...

    图像有损压缩与无损压缩

    Modern web browsers accept four image formats by default: JPEG, GIF, PNG and SVG. But before talking about formats, let’s introduce two extremely important terms: lossless and lossy compression.

    现代网络浏览器默认接受四种图像格式: JPEGGIFPNGSVG 。 但是在讨论格式之前,我们先介绍两个非常重要的术语: 无损压缩和有损压缩。

    Almost all images are compressed in some way. That is, the raw binary data that makes up the individual pixels and their color is packaged up and rearranged to achieve the smallest file size possible for any particular format. There are many different methods of data compression, but every system comes down to one simple question: whether it physically changes the data in the image.

    几乎所有图像都以某种方式压缩。 即,构成单个像素及其颜色的原始二进制数据被打包并重新排列,以实现任何特定格式可能的最小文件大小。 数据压缩有很多不同的方法,但是每个系统都可以解决一个简单的问题:它是否物理地更改了图像中的数据。

    Lossless compression does not change bits. It rearranges them, and tries to pack them into a smaller space - think of different arrangements of boxes in a moving van in an attempt to fit more inside - but does not physically change them. You obviously want a lossless compression scheme in situations for which fidelity to the original data is paramount. .zip is a ubiquitous compression scheme: bits go in, information is re-arranged and compressed, but the same bits come out after you uncompress the .zip. (You don't want the “Z’s” in a compressed Microsoft Word document to be changed to “k’s” just because it would make the file smaller.)

    无损压缩不会更改位。 它会重新排列它们,并尝试将它们包装在较小的空间中-考虑在移动的货车中尝试不同的盒子布​​置,以试图容纳更多的内部空间-但不会在物理上改变它们。 在原始数据的保真度至关重要的情况下,您显然希望使用无损压缩方案。 .zip是一种无处不在的压缩方案:位进入,信息被重新安排和压缩,但是在您解压缩.zip之后出现相同的位。 (您不希望将压缩的Microsoft Word文档中的“ Z”更改为“ k”,只是因为它会使文件变小。)

    There are many lossless image compression formats: TIF, TGA, BMP, RAW, PNG, SVG and PSD among them. Arguably, even GIF is a lossless format. Assuming that you are feeding them the best information possible, all of those formats will preserve data completely, without loss or change. The easiest compression scheme is run-length encoding: if there are several pixels of the exact same color one after the other in a horizontal line, rather than counting them separately, GIF makes a shortcut code for them (say “five red pixels”, rather than counting “one red pixel, another red pixel…” and so on).

    无损图像压缩格式很多,其中包括TIFTGABMPRAWPNGSVGPSD 。 可以说,甚至GIF都是无损格式。 假设您正在向他们提供最佳信息,那么所有这些格式将完全保留数据,而不会丢失或更改。 最简单的压缩方案是游程编码:如果在水平线上有多个颜色完全相同的像素,而不是分别计数,则GIF会为它们创建快捷方式代码(例如“五个红色像素”,而不是计算“一个红色像素,另一个红色像素……”,依此类推)。

    The major drawback to a lossless compression scheme (with the exception of SVG, which is predominantly a vector format) is file size. No matter how clever the algorithm, the data must be completely preserved. But what if we could change some of that data - squish it, alter it, or even throw it out - in such a way that the end user is unlikely to spot any changes?

    无损压缩方案(主要是矢量格式的SVG除外)的主要缺点是文件大小。 无论算法多么聪明,都必须完全保留数据。 但是,如果我们可以更改某些数据(压缩,更改甚至丢弃),以致最终用户不太可能发现任何更改,该怎么办?

    This can’t be done with Word documents… but pixels are very small. If we can change some of them to be more like their neighboring pixels, we would increase the number of shortcuts we could take in describing the image, which in turn would reduce its file size. And that’s exactly what lossy compression does. There are a few lossy compression schemes for images; JPEG is the most well-known.

    Word文档无法做到这一点……但是像素非常小。 如果我们可以将其中一些更改为更接近其相邻像素,则将增加描述图像时可以使用的快捷方式的数量,从而减少其文件大小。 这正是有损压缩的作用。 有一些针对图像的有损压缩方案。 JPEG是最著名的。

    Lossy compression gives significant advantages in terms of file size. However, it comes with one major caveat: the changes made to the image to achieve this compression can't be undone. That is, the original information is lost, and can't be retrieved. (And no amount of digital wizardry can recover it - despite what the movies and television tell you).

    有损压缩在文件大小方面具有明显优势。 但是,它带有一个主要警告:对图像进行的更改以实现这种压缩是无法撤消的。 也就是说,原始信息将丢失,并且无法检索。 ( 尽管电影和电视告诉您,但没有任何数字巫术可以恢复它)。

    翻译自: https://thenewcode.com/62/Images-Lossy-vs-Lossless-Compression

    图像有损压缩与无损压缩

    展开全文
  • 有损通过imagemin-pngquant和imagemin-mozjpeg压缩图像 如何使用 var imagemin = require ( 'lossy-imagemin' ) ; var opt = { base : 'res' , // destPath retain src dir info jpgQuality : '70' , // max 100,...
  • 图像无损、有损压缩方法调研 无损压缩 无损压缩的压缩比相对较小,一般只能获得1-5倍的压缩比。常见的图像无损压缩编码方法主要有霍夫曼编码、算术编码、行程编码和LZW编码。 以上四种编码都属于统计编码的范畴,...

    图像无损、有损压缩方法调研

    无损压缩

    无损压缩的压缩比相对较小,一般只能获得1-5倍的压缩比。常见的图像无损压缩编码方法主要有霍夫曼编码、算术编码、行程编码和LZW编码

    以上四种编码都属于统计编码的范畴,消除的是编码冗余,而预测编码消除的是像素间冗余。预测编码的基本思想建立在图像中邻近像素间高度相关的事实基础上。预测编码的突出的技术特点是不直接传送像素值,而对实际像素值与它的一个预测值之间的差值进行编码和传送,这种差值称为预测误差。

    有损压缩

    灰度级量化压缩

    该算法采用低比特截断。如对于8比特图像,若将图像均匀量化为6比特,则将每个像素中最低两位的比特数截断,仅用前6位来表示,这样便实现了图像数据的压缩。而在重构图像时,低位被截断的比特用0补齐。

    改进的行程编码

    在全局设定一个阈值T,假定扫描的第一个像素灰度值为a,设为标准值data,第二个像素的灰度值为b,若b与data之差的绝对值小于或等于阈值T,则第二个像素的灰度值也量化为a,第三个像素的灰度值继续与标准值data比较,以此类推,直到遇到差的绝对值大于阈值T的像素,此时将此像素的灰度值设为新的标准值data,量化的方法与前面相同。算法改进的关键是引入了判决门限T,T的引入可以增加游程的长度,从而可以有效地提高压缩比。

    基于小波变换的图像压缩算法

    小波变换是世纪年代中期发展起来的一种时频域分析方法,由于小波及小波包技术可以将图像分层按小波基展开,所以可以根据图像信号的性质以及事先给定的处理要求确定展开的层数,因此不仅能有效地控制计算量满足实时处理的要求,而且可以方便地实现累进传输编码。另外,利用小波变换具有放大、缩小和平移的数学显微镜功能,可以方便地产生各种分辨率的图像,适应不同分辨率的图像I/O设备和不同传输速率的通信系统。

    一般情况下,对于静止的灰度图像,小波编码可以分成三个部分:小波变换、量化、编码,解码过程与编码过程完全相反。

    简单的小波变换压缩

    最简单的小波变换压缩便是只保留小波变换低频子带,重构时高频部分全部置零,然后进行反变换。图像像素间的相关性很强,小波分解后的高频分量的能量占整个图像能量的比例很低,因此舍去高频部分的能量对于重构图像的质量应该不会产生很大的影响。

    改进的EZW算法

    EZW编码的算法是将低频子带的系数包含在其中扫描的,而低频子带集中了图像的大部分能量,系数值较高,因此初始阈值的取值较高,为了提高重构图像的质量,不得不增加扫描的级数。改进的EZW算法可以抑制算法的这种缺点并满足图像压缩的近无损失真且尽量保留细节的要求。改进如下:

    1. 对低频系数进行单独的无损编码,因为低频系数所占的比例不大,但同时又包含了图像的大部分能量,所以对低频系数进行无损编码可以大大改善图像的质量。
    2. 提取高频系数中的边缘信息,将其保护起来,不作量化。因为边缘和轮廓等细节信息正可能是图像的价值所在。

    Reference

    哈夫曼编码

    算术编码

    LZW编码

    小波变换

    展开全文
  • 图像的基本有损压缩和无损压缩及解压

    万次阅读 多人点赞 2016-11-17 20:12:27
    背景有损量化这里介绍从8-8-8到5-5-5和5-6-5的量化压缩原理及其编程实现。无损压缩这里基于游长编码算法(利用像素的重复)首先提出一种简单改进算法,即在图像的各通道上进行游长编码,利用各通道像素值得重复性分别...

    关键词:5-5-5,5-6-5,游长编码优化,图像压缩、解压

    背景

    有损量化这里介绍从8-8-8到5-5-5和5-6-5的量化压缩原理及其编程实现。无损压缩这里基于游长编码算法(利用像素的重复)首先提出一种简单改进算法,即在图像的各通道上进行游长编码,利用各通道像素值得重复性分别进行压缩,一定程度上提高了压缩性,因为两个相邻像素虽然不同,但他们的某个通道可能会相同,这种方法简单高效,但适应性差,主要利用了图像的空间冗余性;之后,提出压缩前的分块处理,为了减少图像各区域之间的巨大差异造成的重复性被分割削弱,先从二维上将图像分块,再对分块进行空间冗余压缩,也就是更加充分地利用图像的空间冗余性。

    Giuthub源码:https://github.com/jiangxh1992/QuantisationAndCompression

    English Version:http://jiangxh.top/articles/2016-10/compressionEN


    有损量化5-5-5和5-6-5

    压缩对象使图像的RGB通道值,每个值都是0~255之间的数字,分别使用8位保存,因此原始图像每个像素要使用3*8=24位,即‘8-8-8’。这里要将其量化压缩,使用16位来保存24位的信息,因此要损失部分精度,压缩率固定为1.50。

    这里写图片描述
    这里写图片描述
    这里写图片描述

    5-5-5指的是只使用低15位,剩下的一位弃用,这样每个通道一致的都压缩为5位;

    5-6-5则是充分使用了16位,其中G通道占6位,另外两通道各占5位。

    算法原理很简单:

    压缩时5-5-5是将每个通道的二进制值都右移3位(除以8),保留剩下的5位,然后依次放入16位数的低15位;解压时分别将各通道的5位二进制数取出并左移3位,低位补0还原成8位,因此低三位的数据丢失掉了。

    5-6-6和5-5-5同理,只是G通道的二进制数右移2两位(除以4),将剩下的6位和其他两通道的10位一同放入16位二进制数中。解压时同样是低位补0还原为8位。

    算法代码:

    程序背景说明:widthheight指的是导入的图片的尺寸(像素个数),Input是保存三个通道的像素值的数组,这里windows工程存储的三通道顺序为B,G,R,不是R,G,B。

    这里写图片描述

    5-5-5:

    unsigned char *CAppQuantize::Quantize555(int &qDataSize) {
    
        int i, j ;
        unsigned int r, g, b ;
        unsigned short rgb16 ;
    
        qDataSize = width * height * 2 ;
    
        unsigned char *quantizedImageData = new unsigned char[width * height * 2] ;
    
        for(j = 0; j < height; j++) {
            for(i = 0; i < width; i++) {
                b = pInput[(i + j * width) * 3 + 0] ;   // Blue Color Component
                g = pInput[(i + j * width) * 3 + 1] ;   // Red Color Component
                r = pInput[(i + j * width) * 3 + 2] ;   // Green COlor Component
                rgb16 = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3) ;
                quantizedImageData[(i + j * width) * 2 + 0] = rgb16 & 0xFF ;
                quantizedImageData[(i + j * width) * 2 + 1] = (rgb16 >> 8) & 0xFF ;
            }
        }
    
        return quantizedImageData ;
    }
    void CAppQuantize::Dequantize555(unsigned char *quantizedImageData, unsigned char *unquantizedImageData) {
    
        int i, j ;
        unsigned int r, g, b ;
        unsigned short rgb16 ;
    
        for(j = 0; j < height; j++) {
            for(i = 0; i < width; i++) {
                rgb16 = quantizedImageData[(i + j * width) * 2 + 0] | (((unsigned short) quantizedImageData[(i + j * width) * 2 + 1]) << 8) ;
                b = rgb16 & 0x1F;
                g = (rgb16 >> 5) & 0x1F ;
                r = (rgb16 >> 10) & 0x1F ;
                unquantizedImageData[(i + j * width) * 3 + 0] = (b << 3) ;
                unquantizedImageData[(i + j * width) * 3 + 1] = (g << 3) ;
                unquantizedImageData[(i + j * width) * 3 + 2] = (r << 3) ;
            }
        }
    }

    5-6-5:

    unsigned char *CAppQuantize::Quantize565(int &qDataSize) {
    
        int i, j;
        unsigned int r, g, b;
        unsigned short rgb16;
    
        qDataSize = width * height * 2 ;
        unsigned char *quantizedImageData = new unsigned char[width * height * 2] ;
    
        for (j = 0; j < height; j++) {
            for (i = 0; i < width; i++) {
                b = pInput[(i + j * width) * 3 + 0];    // Blue Color Component
                g = pInput[(i + j * width) * 3 + 1];    // Green Color Component
                r = pInput[(i + j * width) * 3 + 2];    // Red Color Component
                rgb16 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); // r分量和b分量右移3位,g分量右移2位
    
                quantizedImageData[(i + j * width) * 2 + 0] = rgb16 & 0xFF; // 高8位
                quantizedImageData[(i + j * width) * 2 + 1] = (rgb16 >> 8) & 0xFF;// 低8位
            }
        }
    
        return quantizedImageData ;
    }
    void CAppQuantize::Dequantize565(unsigned char *quantizedImageData, unsigned char *unquantizedImageData) {
    
        int i, j;
        unsigned int r, g, b;
        unsigned short rgb16;
    
        for (j = 0; j < height; j++) {
            for (i = 0; i < width; i++) {
                rgb16 = quantizedImageData[(i + j * width) * 2 + 0] | (((unsigned short)quantizedImageData[(i + j * width) * 2 + 1]) << 8);
                b = rgb16 & 0x1F;   // 保留高5位
                g = (rgb16 >> 5) & 0x3F;// 右移5位后保留高6位
                r = (rgb16 >> 11) & 0x1F;// 右移11位后保留高5位
                unquantizedImageData[(i + j * width) * 3 + 0] = (b << 3); // 左移3位,高位补0
                unquantizedImageData[(i + j * width) * 3 + 1] = (g << 2); // 左移2位,高位补0
                unquantizedImageData[(i + j * width) * 3 + 2] = (r << 3); // 左移3位,高位补0
            }
        }
    }

    通道游长编码无损压缩

    这里写图片描述

    压缩过程:

    压缩后的数据形式是:两个无符号8位二进制数为一组,第一个存储重复的个数,第二个存储通道值。

    分B,G,R三个通道依次进行,对于每个通道从第一个值开始,计算后面相同的值的个数,碰到新的不同值或者重复个数超出了8位数的表示上限,则将之前的重复值和通道值保存到一组压缩后的数据中,并开始下一组同样的计算压缩,直到所有数据全部压缩完。

    解压过程:

    解压也是分三个通道依次解压,由于三个通道的压缩数据都放在了同一个数组,因此先要找到G通道和R通道的开始位置offset_g和offset_r,寻找方法是循环同时累加计算前面通道各像素的重复个数,每当重复个数达到图片像素个数,下一个即时另一个通道的开始了。之后开始解压,每次从各通道取一个值组成一个像素,直到各通道同时取完,解压后的数据就是压缩前的原数据了,实现了图像的无损压缩。

    算法代码:

    无损压缩:

    unsigned char *CAppCompress::Compress(int &cDataSize) {
    
        unsigned char *compressedData ;
        cDataSize = width * height * 3 ;    
    
        // 存储压缩后的数据,最差的情况尺寸也不会到大于cDataSize * 2
        compressedData = new unsigned char[cDataSize * 2];
        // 实际压缩字符长度
        int compressedSize = 0;
    
        // 采用分通道游离的方法,按照每个通道相邻像素的重复性进行压缩
        // 1.b通道
        unsigned short curB = pInput[0];// 第一个像素的b
        unsigned short repeat = 1;// 重复次数
        for (int i = 1; i < cDataSize / 3; i++)
        {
            unsigned short nextB = pInput[i * 3 + 0];// 下一个像素的b
            if (nextB == curB && repeat < 127)
            {
                ++repeat;
                // 如果是最后一个则存储
                if (i == cDataSize / 3 - 1)
                {
                    // 存储最后一个b值组
                    compressedData[compressedSize] = repeat;
                    compressedData[compressedSize + 1] = curB;
                    // 增加编码数据长度
                    compressedSize += 2;
                }
            }
            else
            {
                // 存储上一个b值组
                compressedData[compressedSize] = repeat;
                compressedData[compressedSize + 1] = curB;
                // 增加编码数据长度
                compressedSize += 2;
                // 换下一种b值
                curB = nextB;
                repeat = 1;
                // 如果是最后一个
                if (i == cDataSize / 3 - 1)
                {
                    // 存储最后一个b值
                    compressedData[compressedSize] = 1;
                    compressedData[compressedSize + 1] = curB;
                    // 增加编码数据长度
                    compressedSize += 2;
                }
            }
        }
    
        // 2.g通道
        unsigned short curG = pInput[1];// 第一个像素的g
        repeat = 1;// 重复次数
        for (int i = 1; i < cDataSize / 3; i++)
        {
            unsigned short nextG = pInput[i * 3 + 1];// 下一个像素的g
            if (nextG == curG && repeat <= 127)
            {
                ++repeat;
                // 如果是最后一个则存储
                if (i == cDataSize / 3 - 1)
                {
                    // 存储最后一个g值组
                    compressedData[compressedSize] = repeat;
                    compressedData[compressedSize + 1] = curG;
                    // 增加编码数据长度
                    compressedSize += 2;
                }
            }
            else
            {
                // 存储上一个g值组
                compressedData[compressedSize] = repeat;
                compressedData[compressedSize + 1] = curG;
                // 增加编码数据长度
                compressedSize += 2;
                // 换下一种g值
                curG = nextG;
                repeat = 1;
                // 如果是最后一个
                if (i == cDataSize / 3 - 1)
                {
                    // 存储最后一个g值
                    compressedData[compressedSize] = 1;
                    compressedData[compressedSize + 1] = curB;
                    // 增加编码数据长度
                    compressedSize += 2;
                }
            }
        }
    
        // 3.r通道
        unsigned short curR = pInput[2];// 第一个像素的r
        repeat = 1;// 重复次数
        for (int i = 1; i < cDataSize / 3; i++)
        {
            unsigned short nextR = pInput[i * 3 + 2];// 下一个像素的r
            if (nextR == curR && repeat <= 127)
            {
                ++repeat;
                // 如果是最后一个则存储
                if (i == cDataSize / 3 - 1)
                {
                    // 存储最后一个g值组
                    compressedData[compressedSize] = repeat;
                    compressedData[compressedSize + 1] = curR;
                    // 增加编码数据长度
                    compressedSize += 2;
                }
            }
            else
            {
                // 存储上一个g值组
                compressedData[compressedSize] = repeat;
                compressedData[compressedSize + 1] = curR;
                // 增加编码数据长度
                compressedSize += 2;
                // 换下一种r值
                curR = nextR;
                repeat = 1;
                // 如果是最后一个
                if (i == cDataSize / 3 - 1)
                {
                    // 存储最后一个r值
                    compressedData[compressedSize] = 1;
                    compressedData[compressedSize + 1] = curR;
                    // 增加编码数据长度
                    compressedSize += 2;
                }
            }
        }
    
        // 取出压缩后的纯数据
        cDataSize = compressedSize;
        unsigned char *finalData = new unsigned char[cDataSize];
        for (int i = 0; i < cDataSize; i++)
        {
            unsigned char temp = compressedData[i];
            finalData[i] = temp;
        }
        delete compressedData;
        compressedData = finalData;
    
        return compressedData;
    }

    无损解压缩:

    void CAppCompress::Decompress(unsigned char *compressedData, int cDataSize, unsigned char *uncompressedData) {
    
        // 寻找g通道和r通道在压缩数据数组中的偏移坐标
        int offset_r = 0, offset_g = 0;
        int pixelCount = 0;
        for (int i = 0; i < cDataSize;)
        {
            int curRpeat = compressedData[i];
            pixelCount += curRpeat;
            i += 2;
            if (pixelCount == width*height)
            {
                offset_g = i;// g通道的开始坐标
            }
            if (pixelCount == width*height * 2)
            {
                offset_r = i;// r通道的开始坐标
            }
        }
    
        unsigned int b, g, r;
        int repeat;
        // 1.还原b通道
        for (int i = 0, j = 0; i < width*height, j < offset_g; j += 2)
        {
            // 恢复一组重复的b值
            repeat = compressedData[j];
            for (int p = 0; p < repeat; p++)
            {
                int d = compressedData[j + 1];
                uncompressedData[i * 3 + p*3 + 0] = compressedData[j + 1];
            }
            i += repeat;
        }
    
        // 2.还原g通道
        for (int i = 0, j = offset_g; i < width*height, j < offset_r; j += 2)
        {
            repeat = compressedData[j];
            for (int p = 0; p < repeat; p++)
            {
                int d = compressedData[j + 1];
                uncompressedData[i * 3 + p * 3 + 1] = compressedData[j + 1];
            }
            i += repeat;
        }
    
        // 3.还原r通道
        for (int i = 0, j = offset_r; i < width*height, j < cDataSize; j += 2)
        {
            repeat = compressedData[j];
            for (int p = 0; p < repeat; p++)
            {
                int d = compressedData[j + 1];
                uncompressedData[i * 3 + p * 3 + 2] = compressedData[j + 1];
            }
            i += repeat;
        }
    }

    效果分析:

    最好情况: 算法基于通道像素重复,最好的情况自然是纯色推图像。算法对于颜色比较单调的图像压缩效果较好;

    最差情况: 最差情况是三个通道相邻的两个像素的值都不同,这时候压缩后的数据刚好是原数据的两倍大小,每一个像素各通道值都额外用了一个8位存储重复个数,且重复个数都是1。

    压缩到六十四分之一:
    这里写图片描述

    压缩到三分之一:
    这里写图片描述

    压缩失败:
    这里写图片描述


    空间分割优化

    算法步骤:首先先后对图像进行横向、纵向或者横向、纵向扫描,扫描时对每一行或者每一列计算平均值,当平均值和上一行或者列差值大于阈值时,设置当前行列为一个边界。例如:如果先横向分割,后纵向分割,那么横向分割后将图像分成了几个子图像,之后再对每一个子图像进行同样的纵向分割,即可将图像分成内部类似的子图像区域。之后再对子图像进行空间冗余性压缩。图像分割效果大致如下:
    这里写图片描述

    示例代码:

    type cpp
    

    量化压缩与无损压缩组合

    直接使用该算法对图像压缩,面对色彩变化丰富的图像总是压缩失败的,但如果先对图像进行有损量化,再对量化后的图像进行无损压缩往往可以取得不错的效果。量化实际上是为无损压缩提高了容错性,本来两个通道值相差可能很小,如果能包容这微小的差异那么将大大提高压缩率。下图中打印的三个压缩率依次是:直接压缩的压缩率、有损量化的压缩率、对量化后的图像再进行无损压缩的压缩率。

    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    进一步的先进压缩算法

    实际中的图像往往是颜色丰富错综复杂的,仅仅利用空间冗余来进行压缩适应性太低,利用重复性进行游长编码压缩往往不但压缩失败,甚至会使压缩后的图像体积更大,最差的情况如上所说会是原来的两倍。因此为了研究适应性更好的算法就要从更多维度去利用图像本身的重复性(图像的重复性再多维度上是很大的)。

    从另一种程度上图像信息是一种信号信息,图像数据的内在联系不仅仅是相邻像素之间的相似性而已,图像可以向声音信号一样常使用波信号去模拟预测,挖掘图像整体的信息后可以利用已有信息在压缩过程中对未压缩数据进行预测,利用图像的多维度重复性进行进一步的压缩。

    自适应预测熵编码

    。。。

    基于分片的无损压缩方法

    。。。

    展开全文
  • 有损压缩/压缩算法实验 1、问题及说明 查阅JPEG编码的有关资料,对图像进行JPEG压缩,算法步骤必须包括如下几个部分:图像分块,离散余弦变换,量化,ac和dc系数的Z字形编排。 在输入灰度图像时直接将样例中的...
  • java实现png有损压缩

    2017-03-22 19:25:00
    因为项目历史原因,将所有图片改为jpg太麻烦,所以选择png有损压缩;在调研了一番之后,选择pngquant,官网介绍压缩率可以达到70%。 pngquant官网:https://pngquant.org/ 源码:...
  • 无损压缩:是对文件本身的压缩,和其它数据文件的压缩一样,是对文件的数据存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容,对于数码图像而言,也就不会使图像细节有任何...
  • Lossy Image Compression with Compressive Autoencoders
  • Java压缩图片

    2019-03-13 15:48:11
    压缩分为有损压缩和无损压缩。我做的是有损压缩。只是将图片比如5M大小压到100K以内甚至是50K。为了更加快速的展示图片。 要求 不要小看任何一个功能,可能看起来很简单,当做的的时候会遇到很多问题。 任务 ...
  • opencv压缩图片

    2021-01-29 21:10:02
    jpg格式的有损压缩(牺牲图片质量) img = cv2.imread("E:/code/conputer_visual/data/0.jpg", 1) #param2为压缩参数,50代表压缩比例,该值范围在0-100,越小代表压缩力度越大 cv2.imwrite("E:/code/conputer_...
  • 有损压缩与无损压缩之间的主要区别: 有损压缩 无损压缩 文件质量 有损压缩是对图像本身的改变,保留了较多的亮度信息,将色相和色纯度的信息和周围的像素进行合并,信息量减少,图像质量也会相应的下降 ...
  • 有损压缩无损压缩

    2021-11-08 10:45:10
    有损压缩格式:JPEG、JPG、WMF、WebP (jpeg、jpg、wmf) 无损压缩的图片格式:BMP、PCX、TIFF、GIF、TGA、PNG、RAW(bmp、pcx、tiff、gif、tga、png、raw) 有损压缩详细格式: (1)WebP是Google新推出的影像技术,...
  • BMP/JPG/PNG/GIF/有损压缩和无损压缩【转载整理】 1.bmp: BMP是windows的标准图像格式,是一种与硬件设备无关的图像文件格式,在Windows环境下运行的所有图像处理软件都支持这种格式。 BMP文件存储数据时,...
  • 文章目录傅里叶变换概念定义帕瑟瓦尔定理 傅里叶变换概念 傅里叶变换(Fourier transform)是一种线性积分变换,用于信号在时域(或空域)和频域之间的变换。 将函数(通常是时间的函数或信号)分解为三角函数(正弦...
  • 有损批量压缩图片

    2019-11-04 15:16:23
    工作中需要压缩图片,每次找UI要不是没空,要不就是不会。所以只能自己想办法了。 Tinypng 网站提供在线图片压缩服务,是所有图片压缩工具中最好用的之一,但它有所限制: 批量最多处理 20 张,且每张大小不允许...
  • 压缩图像完全符合标准,所有浏览器和操作系统都支持它。 用法 多个文件的批处理转换:pngquant *.png unix样式标准标准/标准链接:... | pngquant - |.. . 要进一步减小文件大小,请尝试optipngImageOp...
  • 它提供3种压缩方法以支持有损和无损压缩。 它还记录压缩的文件,适合个人和团队协作。 如何使用 步骤1:在project的build.gradle档案中: buildscript { repositories { jcenter() } dependencies { ... ...
  • 图片大小不改,全部换成webp格式后的效果,有损压缩,质量20% 首页加载速度: 9.3s 关于页面: 4.7s 服务页面: 3.9s 案例页面: 3.08s 联系我们页面: 2.61s 将图片大小不改,全部压缩后的效果 主页: 8.86s ...
  • WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%。而在我自己的测试里,有时候能小50%。 2. 大企业背书 WebP在2010年发布第一个版本,到现在已经6年了,谷歌旗下的各种网站G+、以及...
  • 前言: 以往文章说了如何上传图片到OSS,这次因为需求,需要将图片进行压缩上传,提高上传速度. 1.我这里没有使用Thumbnails 来压缩图片,因为我发现如果是传入PNG图片,然后转成jpg的时候回出现图片变红,所以我放弃了...
  • PngEncoder.java针对java平台处理png压缩算法
  • Java图片上传压缩处理

    千次阅读 2016-06-20 11:51:07
    我们在项目中经常会出现图片的上传、压缩处理的情况,例如等比例压缩、按照一定的宽度和高度压缩等,公共代码如下: [java] view plain copy   import java.awt.Image;  import ...
  • PNG图片有损压缩软件,大幅减少图片大小,生成资源可在android和iOS上正常渲染。
  • 一个PNG图像的有损压缩命令行程序和库
  • 就是图所占的空间越小,网页显示得越快,为了追求JPG在确保一定画质的前提下,进行最大比例的压缩,出现了不少专门压缩JPG与GIF的图片压缩软件,不过这类的图片压缩软件大多是有损的。 而JPEG Optimizer 不失真图片...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,763
精华内容 3,905
关键字:

图片有损压缩