📄 jr.cpp
字号:
/********************************************************************
Created: 2006/12/11 12:32
FileName: JR.cpp
Author: Jar 包杰
Purpose: 读取显示J压缩文件,并转换为24位BMP图像
Copyright By Jar 2006.12
*********************************************************************/
#include "stdafx.h"
#include "JR.h"
// 声明串行化过程
IMPLEMENT_SERIAL(CJR, CObject, 0);
CJR::CJR()
{
FileName = "";
FilePath = "";
m_pBMFH = NULL;
m_pBMIH = NULL;
m_pBits = NULL;
m_pJFH = NULL;
}
CJR::~CJR()
{
if (m_pBMFH != NULL)
{
delete m_pBMFH;
m_pBMFH = NULL;
}
if (m_pBMIH != NULL)
{
delete m_pBMIH;
m_pBMIH = NULL;
}
if(m_pBits != NULL)
{
m_pBits = NULL;
}
if(m_pJFH != NULL)
{
m_pJFH = NULL;
}
}
/*************************************************
Function: JRead
Description: 读取J文件头
Input: CFile *pFile
Output:
Return: BOOL 成功返回TRUE,否则返回FALSE
Others: 读取J文件头,写BMP文件头和信息头
*************************************************/
BOOL CJR::JRead(CFile *pFile)
{
int nSize;
//创建J文件头
nSize = sizeof(JFILEHEADER);
m_pJFH = (LPJFILEHEADER) new BYTE[nSize];
//读取文件头
pFile->Read(m_pJFH, sizeof(JFILEHEADER));
// 判断是否是J格式的压缩图像
if(m_pJFH->JType != J_HEADER_MARKER)
return FALSE;
FilePath = pFile->GetFilePath();
FileName = pFile->GetFileName() + ".bmp";
///////////////////////////////////////////////////////////////////////////
//写BMP文件头和信息头
m_pBMFH = new BITMAPFILEHEADER;
m_pBMIH = new BITMAPINFOHEADER;
m_pBMFH->bfType = BMP_HEADER_MARKER;
m_pBMFH->bfReserved1 = 0;
m_pBMFH->bfReserved1 = 0;
m_pBMFH->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + m_pJFH->JHeight * (m_pJFH->JWidth * 3 + (4 - m_pJFH->JWidth * 3 % 4));
m_pBMFH->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
m_pBMIH->biSize = sizeof(BITMAPINFOHEADER);
m_pBMIH->biWidth = m_pJFH->JWidth;
m_pBMIH->biHeight = m_pJFH->JHeight;
m_pBMIH->biPlanes = 1;
m_pBMIH->biBitCount = 24;
m_pBMIH->biCompression = 0;
m_pBMIH->biSizeImage = m_pBMFH->bfSize - m_pBMFH->bfOffBits;
m_pBMIH->biXPelsPerMeter = 3780;
m_pBMIH->biYPelsPerMeter = 3780;
m_pBMIH->biClrUsed = 0;
m_pBMIH->biClrImportant = 0;
m_pBits = new BYTE[m_pBMIH->biSizeImage];
///////////////////////////////////////////////////////////////////////////
return TRUE;
}
/*************************************************
Function: JDraw
Description: 显示J压缩图像
Input: *pDC
Output:
Return: BOOL 成功返回TRUE,否则返回FALSE
Others: 读取J文件数据并显示
转换为24位BMP文件
*************************************************/
BOOL CJR::JDraw_BMPCreate(CDC *pDC)
{
CString s;
pDC->TextOut(0,0,"Completed ");
s.Format("Height = %d pix",m_pJFH->JHeight);
pDC->TextOut(0,20,s);
s.Format("Width = %d pix",m_pJFH->JWidth);
pDC->TextOut(0,40,s);
s.Format("FirstColor = RGB(%d,%d,%d)",m_pJFH->FirstColor[0],m_pJFH->FirstColor[1],m_pJFH->FirstColor[2]);
pDC->TextOut(0,60,s);
s.Format("SecondColor = RGB(%d,%d,%d)",m_pJFH->OpposeColor[0],m_pJFH->OpposeColor[1],m_pJFH->OpposeColor[2]);
pDC->TextOut(0,80,s);
//创建文件
CFile JFile,BMPFile;
JFile.Open(FilePath,CFile::modeRead);
JFile.Seek(sizeof(JFILEHEADER),CFile::begin);
BMPFile.Open(FileName,CFile::modeCreate|CFile::modeWrite);
///////////////////////////////////////////////////////////////////////////
//写BMP文件的文件头和信息头
BMPFile.Write(m_pBMFH,sizeof(BITMAPFILEHEADER));
BMPFile.Write(m_pBMIH,sizeof(BITMAPINFOHEADER));
LPBYTE tmph_m_pBits = m_pBits; //临时存放BMP数据区首地址
///////////////////////////////////////////////////////////////////////////
//读取压缩数据并显示
int i = 0,j = 0,k = 0;
int nSize = m_pJFH->JHeight * m_pJFH->JWidth;
WORD tmp;
WORD n = -1;
JFile.Read(&tmp,sizeof(WORD));
for (i = 0;i < m_pJFH->JHeight;i++)
{
for (j = 0;j < m_pJFH->JWidth;j++)
{
if (k%2 == 1)
{
pDC->SetPixel(j,m_pJFH->JHeight-i+100,RGB(m_pJFH->FirstColor[0],m_pJFH->FirstColor[1],m_pJFH->FirstColor[2]));
*m_pBits++ = m_pJFH->FirstColor[2];
*m_pBits++ = m_pJFH->FirstColor[1];
*m_pBits++ = m_pJFH->FirstColor[0];
}
else
{
pDC->SetPixel(j,m_pJFH->JHeight-i+100,RGB(m_pJFH->OpposeColor[0],m_pJFH->OpposeColor[1],m_pJFH->OpposeColor[2]));
*m_pBits++ = m_pJFH->OpposeColor[2];
*m_pBits++ = m_pJFH->OpposeColor[1];
*m_pBits++ = m_pJFH->OpposeColor[0];
}
n++;
if (n == tmp)
{
n = 0;
k++;
JFile.Read(&tmp,sizeof(WORD));
}
s.Format("%d %%",(i * m_pJFH->JWidth + j) * 100 / nSize);
pDC->TextOut(75,0,s);
}
m_pBits = m_pBits + m_pBMIH->biWidth % 4;
}
m_pBits = tmph_m_pBits;
BMPFile.Write(m_pBits,m_pBMIH->biSizeImage);
JFile.Close();
BMPFile.Close();
s = "Uncompressed to " + FileName;
pDC->TextOut(0,0,s);
return TRUE;
}
//串行化
void CJR::Serialize(CArchive &ar)
{
JRead(ar.GetFile());
}
//获取文件头指针
LPJFILEHEADER CJR::GetJFH()
{
return m_pJFH;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -