精华内容
下载资源
问答
  • BMP压缩成JPG的源代码

    2019-04-19 15:14:28
    一个把BMP压缩成JPG的源代码。 附: 1. 编译说明 1) 在VC IDE 选择setting->link> 加jpeg.lib 2) 编译程序 2. 原理 程序首先读BITMAP 文件的各像素点的RGB值, library 做压缩 RGB 缓冲区成JPEG文件或缓冲区。
  • 本资源为数字图像处理中的一个作业,注意下载者请稍加修改代码,避免重复率过高,代码为c++编码,主要采用C语言中内容,可实现BMP图像的压缩与解压缩,且压缩是无损压缩。可直接运行。Anhui university同学们尤其...
  • BMP压缩算法

    千次阅读 2016-01-21 15:24:01
    在全文检索中通常要对索引进行压缩存储,在压缩之前如果对文本进行一定的可逆变换能够使之更易压缩,BWT就是这样一种变换.  通过一个例子来介绍BWT,假设一段待转换的文本为:ababc, 则BWT的过程如下:   在T后...

    在全文检索中通常要对索引进行压缩存储,在压缩之前如果对文本进行一定的可逆变换能够使之更易压缩,BWT就是这样一种变换.
        通过一个例子来介绍BWT,假设一段待转换的文本为:ababc, 则BWT的过程如下:

     

    在T后插入结束符#得到新的文本串T#,循环左移,每次一位,得到一个|T#|行的矩阵,按首字母排序得到M
      F = first column of M

      L = last column of M
      BMT使用L来代表T,这样做的原因是L通常比T更容易压缩(具有很多连续的相同元素),那么怎么通过L恢复出T呢?
    注意下面的性质:
        1、L的第一个元素是T中的最后一个元素(这里使用了哨兵元素#,#比26个字母都小。这样就不用记录M矩阵中哪一行和原始字符串相同,可直接取第一行最后一个字符即是原字符串的最后一个字符)。
        2、对于M中的每一行(第一行除外)第一个元素都是最后一个元素的下一个元素(循环左移的结果),也就是说 也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。
        利用这两个性质以上面的例子说明怎么恢复T:
    c是最后一个元素,然后找c的前一个元素,因为M中仅有最后一行是以c开头的,则这一行的b是c的前一个元素,
    再找b的前一个元素,在M中找以b开头的元素,有两行(4、5),到底是哪一行呢?只需看刚才以c开头的那一行之前,在L中出现了几个b,这里出现了一个,
    所以应该看第5行,也就是b之前是a。继续找a的前一个元素。。。。。
     
        显然不能整个存储M,那们上面的过程如何在实际中运用,答案是建立 一个L-M Mapping(LF)的辅助向量
    LF[i]=C[L[i]]+ri 
    其中 C[c]是字符c在F中的zeroth occurrence位置即首位置,ri是c在L[1,i)中c的出现次数。即c在i位置之前出现过的次数
    所以使用BWT,我们最后得到的是L和LF,回复T的算法为:
     
    For each i = u-1, …, 1 do:
          s = LF[s] (threading backwards)
         T[i] = L[s] (read off the next letter back)

     


    补充:


    BWT 是一种以数据块为操作对象的可逆的数据变换方法, 其核心思想是对字符串轮转后得到的字符矩阵进行排序和变换。它本身不会减少数据量, 但是变换后的数据更易于压缩, 所以BWT 是对数据进行压缩前的预处理, 下面以实例说明BWT 的基本原理

    Burrows-Wheeler transform

    算法是非常巧妙的。首先把输入的数据则重排列,使得相同的字符,尽量地排在一起,这样方便压缩。如果只是想把相同的字符放在一起, 可以简单地对各个字符统计一下出现次数,然后放在一起。然而巧妙的地方是,它还可以根据重新排列后的字符串,算出 原始的字符串,从而解压缩。

    重排列的过程如下:

    把输入串的所有rotation(所谓rotation是指轮换,比如abcd有四个轮换,abcd,bcda,cdab,dabc)排序,然后依次把这些rotation 的最后一个字符串接起来成为新的串。这里要注意两个地方,一是各个字符出现的次数是否跟源串相同,二是相同的字符是否更多 地放在一起。

    第一点是很容易证明,取这些rotation的任意一位串连起来,各个字符出现的次数跟源串都是相同的。

    第二点很难证明,现在粗略分析一下。假设源串含有the,排序的结果应该是"he"打头的ratation排在一起 ,这样最后一个字符是"t"的字符也应该排在一起。为什么不用这些rotation的第一位串联起来呢?用第一位的话,解释起来更直观, 但是用第一位串联起来的话,无法反映射回去。

    现在来讨论一下怎么反映射。反映射的算法非常巧妙,从OI到ACM都考过这道题。有O(N)的算法的,实现起来也不难,只是比较难 想到。

    用banana举例,它的六个rotation排序为:

    abanan

    anaban

    ananab

    banana

    nabana

    nanaba

    则转换后的结果为nnbaaa,因为是有序的,我们可以反推出第一列应该为aaabnn,从而可以知道有下列六对相邻关系 na,na,ba,ab,an,an。 这些相邻关系里最小的一对应该是ab,把这六组相邻关系排序一下,为ab,an,an,ba,na,na。

    从而知道六个rotation的第二列分别为b,n,n,a,a,a。

    如果不是这样的话,则它们不应该这样排列,这其实是反证法。

    从而可以得出另一组相邻关系,nab,nan,ban,aba,ana,ana,继续上面的过程,可以得出长度为四的相邻关系,一步步递推, 最终得出原始的所有的rotation。但是怎么知道哪个rotation是源串呢?只要在源串的结束处加一个特殊字符,然后再求rotation, 最终结束符放在最后的rotation就是源串了。 上面的实现是很低效的,是O(n^2)的,不过上面的过程已经说明这个算法可以用了。而且一般来说 ,都是分块压缩的,n不会很大,平方的算法也够了。

    下面描述效率为O(n)的实现方法:

    从以上排序结果中,除了可以得到L[i]是F[i]的前缀外,还可以得到一个重要的性质:L中相同字母出现的顺序和F中相同字母 出现顺序相同。在已知原字符串最后一个字符是L[I]的情况下,要还原原字符串,关键是寻找字符L[I]的前一个字符在数组L中的 位置。

    构造辅助数组,K[c]表示字符c在F中出现的次数,M[c]表示字符c在F中的首要位置,C[i]表示L[i]字符在i位置之前出现过车次数。由此 L[i]前一个字符在数组L中的位置可由C[i] + M[L[i]]推出。本实例中I=4,则依次推出L[4,1,5,2,6,3]="ANANAB",正好是原字符串的反序。 逆变换的时间复杂度和空间复杂度均为O(n)。


    展开全文
  • BMP压缩为JPG的源码

    2015-02-10 11:02:36
    求一段将BMP压缩为JPG的源代码,100大洋献上[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/6.gif][/img]
  • OpenCV将多幅BMP压缩成AVI文件

    千次阅读 2013-09-04 15:22:09
    最近需要同时采集多个摄像头的视频,一般的屏幕录制软件使用不了,只能自己把一幅幅图片保存下来,再转成AVI视频。OpenCV正好提供了这类函数,所以自己做了一个简单的转换工具。主要利用的函数:CvVideoWriter* ...

    最近需要同时采集多个摄像头的视频,一般的屏幕录制软件使用不了,只能自己把一幅幅图片保存下来,再转成AVI视频。

    OpenCV正好提供了这类函数,所以自己做了一个简单的转换工具。主要利用的函数:

    CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps,CvSize frame_size, intis_color=1)

    创建一个视频文件Writer

    Parameters:
    • filename – Name of the output video file.
    • fourcc – 4-character code of codec used to compress the frames. For example,CV_FOURCC('P','I','M,'1') is a MPEG-1 codec,CV_FOURCC('M','J','P','G') is a motion-jpeg codec etc. Under Win32 it is possible to pass -1 in order to choose compression method and additional compression parameters from dialog. Under Win32 if 0 is passed while using an avi filename it will create a video writer that creates an uncompressed avi file.
    • fps – Framerate of the created video stream.
    • frame_size – Size of the video frames.
    • is_color – If it is not zero, the encoder will expect and encode color frames, otherwise it will work with grayscale frames (the flag is currently supported on Windows only).

    encs[CV_FOURCC('H','F','Y','U')]=(char*)"ffenc_huffyuv";
    encs[CV_FOURCC('D','R','A','C')]=(char*)"diracenc";
    encs[CV_FOURCC('X','V','I','D')]=(char*)"xvidenc";
    encs[CV_FOURCC('X','2','6','4')]=(char*)"x264enc";
    encs[CV_FOURCC('M','P','1','V')]=(char*)"mpeg2enc";

    CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec

    CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
    CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

    CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

    CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec 
    CV_FOURCC('U', '2', '6', '3') = H263 codec 
    CV_FOURCC('I', '2', '6', '3') = H263I codec

    CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

    On Windows HighGui uses Video for Windows (VfW), on Linux ffmpeg is used and on Mac OS X the back end is QuickTime.

     

    void cvReleaseVideoWriter(CvVideoWriter** writer)

    释放Writer

     

    int cvWriteFrame(CvVideoWriter* writer, constIplImage* image)

    将读取的图像写入Writer


    由于不知道自己电脑上安装的编码器在OpenCV中要如何用CV_FOURCC的宏表示,所以采用-1的方式选择一种编码方式,然后debug进入opencv源代码得到相应的编码器1935959654。不知道有没有什么方式可以直接获取这些对应的编码方式。

    // VideoSaver.cpp
    
    #include <stdio.h>
    
    #include <cv.h>   
    #include <cvaux.h>   
    #include <highgui.h>   
    
    #pragma comment(lib, "ml.lib")   
    #pragma comment(lib, "cv.lib")   
    #pragma comment(lib, "cvaux.lib")   
    #pragma comment(lib, "cvcam.lib")   
    #pragma comment(lib, "cxcore.lib")   
    #pragma comment(lib, "cxts.lib")   
    #pragma comment(lib, "highgui.lib")   
    #pragma comment(lib, "cvhaartraining.lib") 
    
    #define VIDEO_FRAME_WIDTH	320
    #define VIDEO_FRAME_HEIGHT	240
    #define VIDEO_FPS			20
    
    int main()
    {
    	CvCapture *pLeftCapture = NULL;
    	CvCapture *pRightCapture = NULL;
    
    	int lImgWidth, lImgHeight;
    
    	IplImage *pLeftCurImg = NULL;
    	IplImage *pRightCurImg = NULL;
    
    	CvVideoWriter *pLeftVideoWriter = NULL;
    	CvVideoWriter *pRightVideoWriter = NULL;
    
    	int lFrameIndex = 0;
    	int wait_key, wt = 1;
    	int lSaveVideo = 0;
    
    	pLeftCapture = cvCreateCameraCapture(0);
    	pRightCapture = cvCreateCameraCapture(1);
    
    	if (pLeftCapture == NULL || pRightCapture == NULL)
    	{
    		printf("can not open camera!\n");
    		return -1;
    	}
    
    	cvSetCaptureProperty(pLeftCapture, CV_CAP_PROP_FRAME_WIDTH, VIDEO_FRAME_WIDTH);
    	cvSetCaptureProperty(pLeftCapture, CV_CAP_PROP_FRAME_HEIGHT, VIDEO_FRAME_HEIGHT);
    	cvSetCaptureProperty(pLeftCapture, CV_CAP_PROP_FPS, VIDEO_FPS);
    
    	cvSetCaptureProperty(pRightCapture, CV_CAP_PROP_FRAME_WIDTH, VIDEO_FRAME_WIDTH);
    	cvSetCaptureProperty(pRightCapture, CV_CAP_PROP_FRAME_HEIGHT, VIDEO_FRAME_HEIGHT);
    	cvSetCaptureProperty(pRightCapture, CV_CAP_PROP_FPS, VIDEO_FPS);
    
    	cvNamedWindow("Left Camera");
    	cvNamedWindow("Right Camera");
    	cvMoveWindow("Left Camera", 0, 0);
    	cvMoveWindow("Right Camera", VIDEO_FRAME_WIDTH+10, 0);
    
    
    	lFrameIndex = 0;
    	for (;;)
    	{
    		pLeftCurImg = cvQueryFrame(pLeftCapture);
    		pRightCurImg = cvQueryFrame(pRightCapture);
    
    		if (pLeftCurImg == NULL || pRightCurImg == NULL)
    		{
    			break;
    		}
    
    		lFrameIndex++;
    
    		lImgWidth = pLeftCurImg->width;
    		lImgHeight = pLeftCurImg->height;
    
    		cvShowImage("Left Camera", pLeftCurImg);
    		cvShowImage("Right Camera", pRightCurImg);
    
    		if (lSaveVideo)
    		{
    			if (!pLeftVideoWriter)
    			{
    				pLeftVideoWriter = cvCreateVideoWriter("LeftCapture.avi", 
    					1935959654,//-1,
    					VIDEO_FPS, cvSize(lImgWidth, lImgHeight), 1);
    			}
    
    			if (!pRightVideoWriter)
    			{
    				pRightVideoWriter = cvCreateVideoWriter("RightCapture.avi", 
    					1935959654,//-1,
    					VIDEO_FPS, cvSize(lImgWidth, lImgHeight), 1);
    			}
    
    			cvWriteFrame(pLeftVideoWriter, pLeftCurImg);
    			cvWriteFrame(pRightVideoWriter, pRightCurImg);
    		}
    
    		wait_key = cvWaitKey(wt);
    		if (wait_key == 27) // ESC
    			break;
    		if (wait_key == 's')
    		{
    			lSaveVideo = 1;
    		}
    	}
    
    	cvDestroyWindow("Left Camera");
    	cvDestroyWindow("Right Camera");
    	if (pLeftCapture) cvReleaseCapture(&pLeftCapture);
    	pLeftCapture = NULL;
    	if (pRightCapture) cvReleaseCapture(&pRightCapture);
    	pRightCapture = NULL;
    
    	if (pLeftVideoWriter) cvReleaseVideoWriter(&pLeftVideoWriter);
    	pLeftVideoWriter = NULL;
    	if (pRightVideoWriter) cvReleaseVideoWriter(&pRightVideoWriter);
    	pRightVideoWriter = NULL;
    
    	return 0;
    }

     

    展开全文
  • 查过百度百科,了解了psnr的公式,但关键的均方误差MSE却一直找不到具体的描述啊,我现在想知道用那些数据来求的这个均方误差的呢?
  • bmp 图像 解压缩

    2017-08-21 11:53:55
    基于MiniLZO 的HBITMAP类型 压缩压缩
  • java实现图片bmp转换压缩为jpg,win7格式下转换后图片和原图看起来差别不大
  • BMP压缩封装为AVI视频

    千次阅读 2018-03-13 17:23:17
    因为组内测试序列制作需要,需要将制作好的BMP位图,无压缩封装为AVI视频,并附有多种要求(基准和实验序列交替出现、随机组合等)。因此,需要实现BMP到AVI的无压缩封装。 由于整个测试序列集有大概几千张图片,...

        因为组内测试序列制作需要,需要将制作好的BMP位图,无压缩封装为AVI视频,并附有多种要求(基准和实验序列交替出现、随机组合等)。因此,需要实现BMP到AVI的无压缩封装。

        由于整个测试序列集有大概几千张图片,需要统一的命令规范。因此,无论是采用命令行还是批处理,都还是不够简洁。

        早期,针对这个封装需求,尝试使用的是ffmpeg,无压缩封装。整个过程虽然较为简单,但是却出了一些BUG。

        1.FFmpeg识别RGB24格式为BGR24,且处理时由于与标准RGB的存储不一致,会导致图像颠倒。

        2.将BMP封装为AVI,原图像素会产生位移。

        以下为我使用ffmpeg产生    基准——空白——试验    测试序列的批处理文件。(其中list.txt为拼接视频列表)

    ffmpeg.exe -i 100.bmp -r 1 -c:v copy 1.avi
    ffmpeg.exe -i 100.bmp -r 1 -c:v copy 2.avi
    ffmpeg.exe -i 100.bmp -r 1 -c:v copy 3.avi
    ffmpeg.exe -i 100.bmp -r 1 -c:v copy 4.avi
    ffmpeg.exe -i 100.bmp -r 1 -c:v copy 5.avi
    ffmpeg.exe -i gray.bmp -r 1 -c:v copy 6.avi
    ffmpeg.exe -i 50.bmp -r 1 -c:v copy 7.avi
    ffmpeg.exe -i 50.bmp -r 1 -c:v copy 8.avi
    ffmpeg.exe -i 50.bmp -r 1 -c:v copy 9.avi
    ffmpeg.exe -i 50.bmp -r 1 -c:v copy 10.avi
    ffmpeg.exe -i 50.bmp -r 1 -c:v copy 11.avi
    ffmpeg.exe -f concat -i list.txt -c copy output.avi
    pause
    

    直接使用ffmpeg处理的BMP图片如上。

    由于是主观图像质量评价测试,因此图片不能有二次转码、压缩、额外处理操作。

    此时,参考了许多解决办法。由于需要处理海量图片、命名格式又不一致,因此还是决定自己写个程序解决。

    直接上代码好了……

    1.简单实用了MFC框架,遍历文件夹

    2.实用AVI服务,直接封装BMP图片

    3.根据需要设置了1帧/秒和十张图片组成一个AVI视频的写入方法

    // RandomAviOutput.cpp: 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <afx.h>
    #include <atlimage.h>
    #include "Vfw.h"
    #include  <direct.h>  
    #include  <stdio.h> 
    #include <string>
    //#include "afx.h"
    
    void ImageToAVI(CString AviPath, CString ImgPath);
    void CreateAVI(CImage img, CString name, int videoWidth, int videoHeight, int bpp);
    //argv[1]=输入BMP文件夹,argv[2]=输出文件名
    int main(int argc, char *argv[])
    {
    	printf("input BMP DirPath %s\n", argv[1]);
    	printf("output AVI Path %s\n", argv[2]);
    	if (argc < 2)
    	{
    		printf("check input argv\n");
    		return 0;
    	}
    	char rootpath[MAX_PATH];
    	_getcwd(rootpath, MAX_PATH);
    	CString path = rootpath;
    	CString input,output;
    	if (argc = 3)
    	{
    		input = argv[1];
    		output = argv[2];
    	}
    	else
    	{
    		input = rootpath;
    		output = rootpath;
    	}
    
    	ImageToAVI(output, input);
    	printf("BMP to AVI All Done! \n");
    	return 0;
    }
    //======================================================================================
    //
    // 功能 : 将目录中的BMP图像无压缩封装为AVI视频
    //
    //======================================================================================
    void ImageToAVI(CString AviPath, CString ImgPath)
    {
    	// 初始化AVI 库
    	AVIFileInit();
    
    	CFileFind finder;
    	CString ImgDir=ImgPath+"\\*.bmp";
    	BOOL bFind = finder.FindFile(ImgDir);
    	//遍历文件夹路径中所有的*.bmp文件
    	while (bFind)
    	{
    		bFind = finder.FindNextFile();
    		if (!finder.IsDots() && !finder.IsDirectory())//若不为空且非文件夹
    		{
    			// 获取图像文件绝对路径
    			CString str = finder.GetFilePath();
    			CString title = finder.GetFileTitle();
    			CString name = AviPath + "\\"+title+".avi";
    			//拷贝bmp图片文件名作为生成avi文件名
    			//
    			// Open Image and get image info & data
    			//使用CImage读取图片信息
    			CImage img;		
    			if (FAILED(img.Load(str)))
    			{
    				TRACE("Warning : fail to load file %s!!!\n", str);
    				continue;
    			}
    			int w, h,bpp;
    			w = img.GetWidth();
    			h = img.GetHeight();
    			bpp = img.GetBPP();
    			//img.Destroy();
    			//释放CImage,使用FILE读写图片数据
    			//std::string s = CT2A(str.GetBuffer(0));
    			//FILE *fp;
    			//fopen_s(&fp,s.c_str(), "rb");
    			CreateAVI(img,name,w,h,bpp);//创建avi视频函数
    			printf("BMP to AVI Done and Go Next! \n");
    			
    		}
    	}
    
    	AVIFileExit();
    
    }
    void CreateAVI(CImage img,CString name, int videoWidth, int videoHeight, int bpp)
    {
    	//
    	// Create AVI file
    	//
    	PAVIFILE pAviFile = NULL;
    	HRESULT hr = AVIFileOpen(&pAviFile, name, OF_WRITE | OF_CREATE, NULL);
    	if (0 != hr)
    	{
    		return;
    	}
    
    	//
    	// Create AVI video stream
    	//
    	AVISTREAMINFO strhdr;
    	memset(&strhdr, 0, sizeof(strhdr));
    
    	strhdr.fccType = streamtypeVIDEO;
    	strhdr.fccHandler = mmioFOURCC('X', 'V', 'I', 'D');
    	strhdr.dwScale = 1;
    	strhdr.dwRate = 0.1;
    	//设置帧速 1秒/帧
    
    	UINT pitch = (videoWidth * bpp + 31) / 32 * 4;
    	UINT biSizeImage = (videoWidth * bpp + 31) / 32 * 4 * videoHeight;
    	strhdr.dwSuggestedBufferSize = biSizeImage;
    
    	SetRect(&strhdr.rcFrame, 0, 0, videoWidth, videoHeight);
    
    	// And create the stream;
    	PAVISTREAM pAviStream = NULL;
    	hr = AVIFileCreateStream(pAviFile, &pAviStream, &strhdr);
    	if (0 != hr)
    	{
    		AVIFileRelease(pAviFile);
    		pAviFile = NULL;
    		return;
    	}
    
    	//
    	// Set stream format
    	//
    	BITMAPINFOHEADER bih;
    	memset(&bih, 0, sizeof(BITMAPINFOHEADER));
    
    	bih.biBitCount = bpp;
    	bih.biClrImportant = 0;
    	bih.biClrUsed = 0;
    	bih.biCompression = BI_RGB;
    	bih.biPlanes = 1;
    	bih.biSize = 40;
    	bih.biXPelsPerMeter = 0;
    	bih.biYPelsPerMeter = 0;
    	bih.biWidth = videoWidth;
    	bih.biHeight = videoHeight;
    	bih.biSizeImage = biSizeImage;
    
    	hr = AVIStreamSetFormat(pAviStream, 0, &bih, sizeof(bih));
    
    	if (0 != hr)
    	{
    
    		AVIStreamClose(pAviStream);
    		pAviStream = NULL;
    
    		AVIFileRelease(pAviFile);
    		pAviFile = NULL;
    	}
    
    	// 图像数据缓冲区
    	BYTE * pData = new BYTE[biSizeImage];
    	if (pData)
    	{
    		memset(pData, 0, biSizeImage);
    	}
    
    	//
    	// 读取图像数据,更新AVI视频帧
    	//
    	if (pData)
    	{
    		for (int nFrames = 0; nFrames < 1; nFrames++)//同一图像拷贝10帧,由图像生成10秒avi视频
    		{
    			for (int i = 0; i < videoHeight; i++)
    			{
    				for (int j = 0; j < videoWidth; j++)
    				{
    					COLORREF clr = img.GetPixel(j, videoHeight - 1 - i);//(j,i)  
    					pData[i * pitch + j * (bpp / 8) + 0] = GetBValue(clr);
    					pData[i * pitch + j * (bpp / 8) + 1] = GetGValue(clr);
    					pData[i * pitch + j * (bpp / 8) + 2] = GetRValue(clr);
    
    				}
    			}
    			hr = AVIStreamWrite(pAviStream, nFrames, 1, pData, biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
    		}
    	}
    
    
    	if (pData != NULL)
    	{
    		delete[] pData;
    		pData = NULL;
    	}
    
    	if (pAviStream != NULL)
    	{
    		AVIStreamClose(pAviStream);
    		pAviStream = NULL;
    	}
    
    	if (pAviFile != NULL)
    	{
    		AVIFileRelease(pAviFile);
    		pAviFile = NULL;
    	}
    }

    github:https://github.com/EthanXzhang/BmpToAvi


    展开全文
  • 在利用四叉树编码压缩8位BMP,使用的是十进制Morton码,最终在文件中存储Morton码以及相应栅格属性值。 但是最终发现压缩文件比源文件要大几KB,为什么会有这样的情况... BMP中的文件头、信息头、颜色表都是舍弃了,...
  • 对24位bmp位图文件进行jpg的压缩 传出的参数:outdata 压缩后数据内存指针 nSize 压缩后数据的大小 传入参数:bmp文件的内存数据 以及文件信息 需要 jconfig.h jmorecfg.h jpeglib.h libjpeg.lib 文件支持 void ...

    对24位bmp位图文件进行jpg的压缩

    传出的参数:outdata 压缩后数据内存指针 nSize 压缩后数据的大小

    传入参数:bmp文件的内存数据 以及文件信息

    需要 jconfig.h jmorecfg.h jpeglib.h libjpeg.lib 文件支持

    void BmptoJpg(BYTE* &outdata,int &nSize,BITMAP m_bmpBit1,BYTE* m_pBmpData1,BITMAPINFO BitmapInfo)  //返回压缩后jpg数据,数据的大小
    {
      
     int nAdjust24;
     UINT dwRead=0;
      BYTE* pData24;
     nAdjust24 = BitmapInfo.bmiHeader.biWidth*3%4;
     if (nAdjust24) nAdjust24 = 4-nAdjust24;
      pData24 = new BYTE[(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)*BitmapInfo.bmiHeader.biHeight];
      for (int j=0;j<BitmapInfo.bmiHeader.biHeight;j++){
       for (int i = 0;i<BitmapInfo.bmiHeader.biWidth;i++)
       {
        BYTE red = m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3];
        m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3] =m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3+2];
        m_pBmpData1[j*(BitmapInfo.bmiHeader.biWidth*3+nAdjust24)+i*3+2] = red;
       }
      }
     struct jpeg_compress_struct jcs;
     struct jpeg_error_mgr jem;
     jcs.err = jpeg_std_error(&jem);

     jpeg_create_compress(&jcs);

     jpeg_stdio_dest(&jcs,(char*)outdata,&nSize);
     jcs.image_width = BitmapInfo.bmiHeader.biWidth;    // 为图的宽和高,单位为像素
     jcs.image_height = BitmapInfo.bmiHeader.biHeight;
     jcs.input_components = 3;   // 1,表示灰度图, 如果是彩色位图,则为3
     jcs.in_color_space = JCS_RGB;

     jpeg_set_defaults(&jcs); 
     jpeg_set_quality (&jcs, 60, true);

     jpeg_start_compress(&jcs, TRUE);

     JSAMPROW row_pointer[1];   // 一行位图
     int row_stride;      // 每一行的字节数

     row_stride = jcs.image_width*3;  // 如果不是索引图,此处需要乘以3

     // 对每一行进行压缩
     while (jcs.next_scanline < jcs.image_height) {
         row_pointer[0] = & m_pBmpData1[(jcs.image_height-jcs.next_scanline-1) * (row_stride+nAdjust24)];
         jpeg_write_scanlines(&jcs, row_pointer, 1);
     }

     jpeg_finish_compress(&jcs);

     jpeg_destroy_compress(&jcs);

     delete [] pData24;

    }

     

    void JpgtoBmp(BYTE *indata,int nSize,int size,BYTE* &data)  //size为生成bmp文件分配的内存大小,后面已更正了RGB序列,但还存在RGB逆序的错误,使生成的文件                                                                                     //颜色不对,还需改进
    {
        BITMAPFILEHEADER bfh;  // bmp文件头
     BITMAPINFOHEADER bih;  // bmp头信息
     RGBQUAD rq[256];   // 调色板
     int nAdjust; // 用于字节对齐
     int nComponent = 0;

     // 声明解压缩对象及错误信息管理器
     struct jpeg_decompress_struct cinfo;
     struct jpeg_error_mgr jerr;

     cinfo.err = jpeg_std_error(&jerr);
     jpeg_create_decompress(&cinfo);
     jpeg_stdio_src(&cinfo,(char*) indata,nSize);
     jpeg_read_header(&cinfo, TRUE);
     nAdjust = cinfo.image_width*cinfo.num_components%4;
     if (nAdjust) nAdjust = 4-nAdjust;
     data = new BYTE[size]; 
     jpeg_start_decompress(&cinfo);
     JSAMPROW row_pointer[1];
     while (cinfo.output_scanline < cinfo.output_height)
     {
      row_pointer[0] = &data[(cinfo.output_height - cinfo.output_scanline-1)*(cinfo.image_width*cinfo.num_components+nAdjust)];
      jpeg_read_scanlines(&cinfo,row_pointer ,
         1);
     }
     jpeg_finish_decompress(&cinfo);
     jpeg_destroy_decompress(&cinfo);

     for (int j=0;j<bih.biHeight;j++)
      for (int i = 0;i<bih.biWidth;i++)
      {
       BYTE red = data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3];
       data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3] = data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3+2];
       data[j*(cinfo.image_width*cinfo.num_components+nAdjust)+i*3+2] = red;
      }
     
    }

    转载于:https://www.cnblogs.com/xiaoluyiqing/archive/2012/03/14/2396206.html

    展开全文
  • 动态规划写的灰度压缩解压,只适合bmp文件,包含压缩和解压
  • 数据压缩 BMPtoYUV

    2017-03-28 12:01:17
    实验二 BMPtoYUV实验...它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按
  • bmp图片压缩 C程序

    2015-07-13 18:02:11
    需求:需要将 24位的 bmp 图片 分辨率 320X175 转成 1K以内的 bmp图片 或是 jpg图片 目前,我的LCD 分辨率为 320X240,截取 320X175 为 签名空白处, 保存的bmp签名图片大小 为 3*320*175 字节 转成 单色后 变成...
  • 单张BMP图片压缩成视频流MPG,使用vc2010重新编译,能运行成功,具体调用方法已经在里面封装成接口BmpToMpgStream.h
  • //缩略图实现,将图片(jpg,gif,bmp等等)真实的变成想要的大小import java.io.*;import java.util.*;import com.sun.image.codec.jpeg.*;import java.awt.image.*;import java.awt.*;import java.net.*;import java....
  • 关于bmp图形压缩传输

    2012-08-30 22:04:08
    我用createDIBSection创建DIB位图后,然后将DC BitBlt到DIB位图里面去,现在内存里面保存的是像素数据,如果我将位图保存成文件后通过jpeg压缩在传输出去,应为压缩算法是从文件读取的,那么效率应该会很低吧!...
  • bmp文件格式压缩的代码

    千次阅读 2010-04-29 13:43:00
    一个简单的bmp格式压缩代码,可以将bmp文件的数据段用zlib来压缩。里面有验证程序,可以将压缩后的数据重新恢复成bmp格式。写得比较乱,如果需要解释可以直接mail我。#include#include#include #include"./include/...
  • C#下的BMP图像压缩

    2010-08-09 17:21:00
    这几天研究比较多,其中一个成果就是下面这个图像压缩类。可以把BMP文件压成任意质量的JPEG,在...只有一个没有重载的构造函数,参数是待压缩BMP文件的路径,还有一个长整形的质量参数,在0-100之间取值。 调用enc...
  • 通过C语言实现BMP图像的显示,涉及BMP的图像压缩,及各种位图文件的显示。
  • 数据结构大作业——哈夫曼编码压缩BMP格式文件

    千次阅读 多人点赞 2020-04-17 10:21:06
    数据结构大作业——哈夫曼编码压缩BMP格式文件 首先需要了解BMP图像格式 BMP图像格式详解 其次需要了解哈夫曼编码如何对BMP文件进行压缩 哈夫曼压缩与解压缩 编程部分 从BMP文件中读取需要的内容 首先是自定义图像...
  • BMP格式图片无损压缩成JPG格式图片,便于光学测试图片分析使用。
  • 使用libjpeg实现了对截屏后的BMP图片进行压缩为JPG格式和将JPG转换为BMP格式的操作。避免大家也碰壁,拿出来和大家分享。
  • BMP图片文件很多人了解,不买票图片是windows操作系统中的标准的图片文件格式,想要将BMP图片压缩成JPG图片会有很多人不会,其实对于图片的压缩来讲都差不多,下面分享两种BMP图片压缩成JPG图片的操作方法。...
  • BMP格式的图片怎在线压缩,大家在上传图片的时候有没有遇到过“因文件太大,上传失败”的问题,图片太大不仅占用空间,而且十分影响传递,那有没有什么解决方法呢,接下来让小编来告诉大家吧。 第一、打开电脑,进入...
  • 不过收集图片多了,也就会发现有些图片的清晰度真的很高,后来小编查看了一下,一般像素比较高的图片都是BMP图片。有些人或许会问,什么是BMP图片? BMP图片是一种标准图像文件格式,可以分为两类:设备相关尾图和...
  • 它采用位映射存储格式,除了图像深度可选以外,在绝大多数应用中不采用其他任何压缩。  BMP当中数据的色彩空间是RGB。  典型的BMP图像由以下四部分组成:   1. 位图头文件数据结构,它包含BMP图像文件的类型、...
  • BMP/JPG/PNG/GIF/有损压缩和无损压缩【转载整理】 1.bmpBMP是windows的标准图像格式,是一种与硬件设备无关的图像文件格式,在Windows环境下运行的所有图像处理软件都支持这种格式。 BMP文件存储数据时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,090
精华内容 836
关键字:

bmp压缩