游程编码源代码

游程编码源代码,第1张

这个楼上的诸位说的都是什么啊。今天刚好看到这个问题,把你的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,(虽然我不明白这个原则是咋来的,但是从结果上看是这样)。计算的时候先得到的十进制数字,然后转换二进制。

以上就是关于游程编码源代码全部的内容,包括:游程编码源代码、游程长度编码可以先列后行吗、关于游程编码的一道题,完全不明白,可否解释一下。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10114599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存