这个楼上的诸位说的都是什么啊。今天刚好看到这个问题,把你的E-mail给我把,我有纯c的源码(RLC)。
算了,直接贴关键部分吧。这个有一点C++成分,很容易改的。
bool CompressRunLength(BYTE pSrc, int nSrcLen, BYTE &pDes, int &nDesLen, int nBitsPerSample, void nRuns, int nRunCount, int nRunSize);
bool DecompressRunLength(BYTE pSrc, int nSrcLen, BYTE &pDes, int &nDesLen);
#define GetDWORD(buf,bit,mask) (((DWORD)(((BYTE)buf)+((bit)>>3)))>>((bit)&7)&(mask))
#define GetWORD(buf,bit,mask) (((WORD)(((BYTE)buf)+((bit)>>3)))>>((bit)&7)&(mask))
int GetBitCount(int n)
{
int nBitCount = 0;
while(n)
n >>= 1, nBitCount++;
return nBitCount;
}
int BinarySearch(void pValue, int nVlaueSize, void pArray, int nCount)
{
int nIndex, nResult, nStart = 0, nEnd = nCount-1;
while(nStart <= nEnd)
{
nIndex = (nEnd+nStart)/2;
if((nResult = memcmp((BYTE)pArray+nIndexnVlaueSize, pValue, nVlaueSize)) == 0)
return nIndex;
if(nResult > 0)
nEnd = nIndex-1;
else
nStart = nIndex+1;
}
return -1;
}
bool CompressRunLength(BYTE pSrc, int nSrcLen, BYTE &pDes, int &nDesLen, int nBitsPerSample, void nRuns, int nRunCount, int nRunSize)
{
pDes = (BYTE)malloc(nSrcLen2);
memset(pDes, 0, nSrcLen2);
nDesLen = sizeof(DWORD);
(DWORD)pDes = nSrcLen; // save source length
(pDes+nDesLen++) = nBitsPerSample; // save bits per sample
(pDes+nDesLen++) = nRunCount; // save runs count
(pDes+nDesLen++) = nRunSize; // save run bytes
memcpy(pDes+nDesLen, nRuns, nRunCountnRunSize); // save runs
nDesLen += nRunCountnRunSize;
nDesLen <<= 3; // bytes to bits
if(nRunCount == 0)
nRunCount = 256, nRunSize = 1, nRuns = NULL;
int nBitsPerTypeIndex = GetBitCount(nRunCount-1);
int nMaxRunLength = (1 << nBitsPerSample)-1, nRunLength, nRunIndex, nByte = 0;
// loop in the source buffer
while(nByte < nSrcLen)
if((nRuns && (nRunIndex = BinarySearch(pSrc+nByte, nRunSize, nRuns, nRunCount)) != -1 &&
memcmp(pSrc+nByte+nRunSize, (BYTE)nRuns+nRunIndexnRunSize, nRunSize) == 0) ||
(!nRuns && (nRunIndex = (pSrc+nByte)) == (pSrc+nByte+1)))
{ // set bit to 1 to indicate type found
(pDes+(nDesLen>>3)) |= 1 << (nDesLen&7);
(DWORD)(pDes+(++nDesLen>>3)) |= nRunIndex << (nDesLen&7);
nDesLen += nBitsPerTypeIndex;
// skip the two repeated runs
nByte += nRunSize2;
// get run length - 2 (without the two repeated runs)
nRunLength = 0;
while(nRunLength < nMaxRunLength && nByte < nSrcLen &&
((nRuns && memcmp(pSrc+nByte, (BYTE)nRuns+nRunIndexnRunSize, nRunSize) == 0) || (!nRuns && (BYTE)nRunIndex == (pSrc+nByte))))
nRunLength++, nByte += nRunSize;
// save run length and increment destination length by bits per sample
(DWORD)(pDes+(nDesLen>>3)) |= nRunLength << (nDesLen&7);
nDesLen += nBitsPerSample;
}
else // copy one byte
(WORD)(pDes+(++nDesLen>>3)) |= (pSrc+nByte++) << (nDesLen&7), nDesLen += 8;
nDesLen = (nDesLen+7)/8; // bits to bytes
pDes = (BYTE)realloc(pDes, nDesLen);
return true;
}
bool DecompressRunLength(BYTE pSrc, int nSrcLen, BYTE &pDes, int &nDesLen)
{
if(nSrcLen == 0)
return true;
// allocate destination buffer
nDesLen = (DWORD)pSrc;
pDes = (BYTE)malloc(nDesLen);
memset(pDes, 0, nDesLen);
// copy compression information
int nSrcIndex = sizeof(DWORD);
int nBitsPerSample = (pSrc+nSrcIndex++);
int nRunCount = (pSrc+nSrcIndex++);
int nRunSize = (pSrc+nSrcIndex++);
void nRuns = pSrc+nSrcIndex;
nSrcIndex += nRunSizenRunCount;
nSrcIndex <<= 3; // bytes to bits
if(nRunCount == 0)
nRunCount = 256, nRunSize = 1, nRuns = NULL;
int nBitsPerTypeIndex = GetBitCount(nRunCount-1);
int nMaxTypeIndex = (1 << nBitsPerTypeIndex)-1;
int nMaxRunLength = (1 << nBitsPerSample)-1;
int nDesIndex = 0, nRunLength, nRunIndex, nRun, nByte;
nSrcLen <<= 3; // bytes to bits
while(nSrcIndex < nSrcLen-8)
if(((pSrc+(nSrcIndex>>3)) >> (nSrcIndex++&7)) & 1)
{
nRunIndex = GetDWORD(pSrc, nSrcIndex, nMaxTypeIndex), nSrcIndex += nBitsPerTypeIndex;
nRunLength = GetDWORD(pSrc, nSrcIndex, nMaxRunLength)+2, nSrcIndex += nBitsPerSample;
for(nRun = 0; nRun < nRunLength; nRun++)
for(nByte = 0; nByte < nRunSize; nByte++, nDesIndex += 8)
(WORD)(pDes+(nDesIndex>>3)) |= nRuns GetWORD(nRuns+nRunSizenRunIndex, nByte<<3, 0xff) : (BYTE)nRunIndex;
}
else // copy one byte
(WORD)(pDes+(nDesIndex>>3)) |= GetWORD(pSrc, nSrcIndex, 0xff), nDesIndex += 8, nSrcIndex += 8;
return true;
}
游程长度编码不能先列后行。根据查询相关资料信息,游程长度编码,按照行从左到右的顺序,记录每组像元的属性代码以及相同代码重复个数,还能按照列从上到下的顺序进行记录,游程长度编码不能先列后行的。
不是大神,刚学了游程编码,虽然和这个不完全一样,强行理解一下,希望有帮到你。
首先20,30都拆开我理解是因为这个二进制编码表达限制于每一个组合都是4位,2的4次方个数字,最大值也就只有15,所以超过15的都要减去这一部分,相当于加法进高位的感觉。如果超过30我猜35会拆成15,15,5。
然后这个89,40显然是你编码前原始码长,进行数据压缩以后实际的码长。
数字的来源是这样,他的每一位都是两个被非零元素隔开的零的个数,两个连续的1,那么中间0的个数就表示为0,(虽然我不明白这个原则是咋来的,但是从结果上看是这样)。计算的时候先得到的十进制数字,然后转换二进制。
以上就是关于游程编码源代码全部的内容,包括:游程编码源代码、游程长度编码可以先列后行吗、关于游程编码的一道题,完全不明白,可否解释一下。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)