把CD上的一个图保存为bmp格式的图


// CReadWriteBmpView message handlers
HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
{
HDC hBufDC;
HBITMAP hBitmap, hBitTemp;

//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(hDC);

//创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

//得到位图缓冲区
StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);

//得到最终的位图信息
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

//释放内存

DeleteObject(hBitTemp);
::DeleteDC(hBufDC);

return hBitmap;
}

BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
//设备描述表
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数 
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; 
//位图属性结构 
BITMAP Bitmap;  
//位图文件头结构
BITMAPFILEHEADER bmfHdr;  
//位图信息头结构 
BITMAPINFOHEADER bi;  
//指向位图信息头结构  
LPBITMAPINFOHEADER lpbi;  
//定义文件,分配内存句柄,调色板句柄 
HANDLE fh, hDib, hPal,hOldPal=NULL; 

//计算位图文件每个像素所占字节数 
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 
DeleteDC(hDC); 
if (iBits <= 1) wBitCount = 1; 
else if (iBits <= 4)  wBitCount = 4; 
else if (iBits <= 8)  wBitCount = 8; 
else   wBitCount = 24; 

GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;

//为位图内容分配内存 
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); 
*lpbi = bi; 

// 处理调色板  
hPal = GetStockObject(DEFAULT_PALETTE); 
if (hPal) 

hDC = ::GetDC(NULL); 
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); 
RealizePalette(hDC); 
}

// 获取该调色板下新的像素值 
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) 
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); 

//恢复调色板  
if (hOldPal) 

::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); 
RealizePalette(hDC); 
::ReleaseDC(NULL, hDC); 


//创建位图文件  
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

if (fh == INVALID_HANDLE_VALUE)  return FALSE; 

// 设置位图文件头 
bmfHdr.bfType = 0x4D42; // "BM" 
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;  
bmfHdr.bfSize = dwDIBSize; 
bmfHdr.bfReserved1 = 0; 
bmfHdr.bfReserved2 = 0; 
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; 
// 写入位图文件头 
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 
// 写入位图文件其余内容 
// WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); 
//清除  
GlobalUnlock(hDib); 
GlobalFree(hDib); 
CloseHandle(fh); 

return TRUE;
}
实现像压缩的方法有很多种,其中最常用的方法是离散余弦变换(Discrete Cosine Transform, DCT)和小波变换(Wavelet Transform)。这里我们以小波变换为例,介绍如何用Matlab实现一幅灰度像的压缩,并将其转换为jpg格式。 首先,我们需要加载原始像,可以使用Matlab自带的imread函数,例如: ``` I = imread('lena.bmp'); % 加载灰度像 ``` 接着,我们将像进行小波变换,可以使用Matlab自带的wavedec2函数,例如: ``` [CA,CH,CV,CD] = wavedec2(I,3,'db4'); % 进行三级小波变换,选用db4小波基函数 ``` 其中,CA为逼近系数,CH、CV、CD为水平、垂直和对角细节系数。通过调整小波分解的级数和小波基函数,可以获得不同的压缩效果。 接下来,我们将细节系数进行量化和编码,以减小数据量。这里我们选用了JPEG2000标准的量化表,可以通过下面的代码实现: ``` L = [16 11 10 16 24 40 51 61; ... 12 12 14 19 26 58 60 55; ... 14 13 16 24 40 57 69 56; ... 14 17 22 29 51 87 80 62; ... 18 22 37 56 68 109 103 77; ... 24 35 55 64 81 104 113 92; ... 49 64 78 87 103 121 120 101; ... 72 92 95 98 112 100 103 99]; % JPEG2000量化表 S = [1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1; ... 1 1 1 1 1 1 1 1]; % 量化表缩放因子 C = zeros(size(CD)); for i = 1:size(CD,3) C(:,:,i) = round(CD(:,:,i)./(L*S)); % 进行量化 end ``` 然后,我们将逼近系数和量化后的细节系数进行熵编码,以进一步压缩数据。这里我们选用了JPEG标准的哈夫曼编码,可以使用Matlab自带的huffenco函数实现: ``` CA = huffenco(CA); % 对逼近系数进行哈夫曼编码 C = huffenco(C(:)); % 对细节系数进行哈夫曼编码 ``` 最后,我们将编码后的数据保存为jpg格式的文件,可以使用Matlab自带的imwrite函数: ``` imwrite(I,'lena.jpg','jpg','Comment','压缩比为50%'); % 保存为jpg格式 ``` 这里我们还可以通过调整压缩比来控制压缩效果,例如: ``` imwrite(I,'lena.jpg','jpg','Quality',50,'Comment','压缩比为50%'); % 压缩比为50% imwrite(I,'lena.jpg','jpg','Quality',80,'Comment','压缩比为80%'); % 压缩比为80% ``` 注意:由于哈夫曼编码和量化表是固定的,因此压缩后的像质量可能不如专业的像压缩软件。此外,这里只介绍了对灰度像的压缩,如果要对彩色像进行压缩,需要进行颜色空间转换和通道分解等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值