圈圈好像做过这个算法呀!不然怎么连那个数组都给猜对了

[复制链接]
 楼主| 艾森豪威尔 发表于 2007-3-21 15:58 | 显示全部楼层 |阅读模式
现在这个算法已经有点眉目了,我这是JPEG->BMP转换的代码,现在转换后的BMP已经能能出来大致的轮廓了,但是各种颜色有点混乱,请各位大虾再加把劲帮我把这个弄出来,谢谢!
singed short get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
    _asm {
           xor ecx, ecx
           mov cl,k
           mov eax,[wordval]//wordval为unsigned int类型
           shl eax,cl
           shr eax, 16
           dec cl
           bt eax,ecx
           jc end_macro
    signed_value:inc cl
           mov ebx,[start_neg_pow2]//start_neg_pow2为signed short*指针
           add ax,word ptr [ebx+ecx*2]
         end_macro:
    }
}

unsigned short WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
    _asm {
          mov ah,byte_high
          mov al,byte_low
         }
}

unsigned short lookKbits(unsigned char k)
{
_asm {
     mov dl, k
     mov cl, 16
     sub cl, dl
     mov eax, [wordval]//wordval为unsigned int类型
     shr eax, cl
}
}
lenglx 发表于 2007-3-21 18:45 | 显示全部楼层

简单

singed short get_svalue(unsigned char k)
{
    unsigned int tmp = (wordval << k ) >> 16;
    
    if(0 == tmp & ( 1<< (k-1) ) )
        tmp += start_neg_pow2[k-1];
        
    return tmp;        
}

unsigned short WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
    return ((unsigned short)byte_hight<<8) + byte_low;
}

unsigned short lookKbits(unsigned char k)
{
    return wordval >> (16 - k);
}
 楼主| 艾森豪威尔 发表于 2007-3-21 19:36 | 显示全部楼层

请教楼上大虾

add ax,word ptr [ebx+ecx*2]
是否应为tmp += start_neg_pow2[k*2];   ?
音乐乐乐 发表于 2007-3-21 19:48 | 显示全部楼层

PC汇编?强

lenglx 发表于 2007-3-21 20:01 | 显示全部楼层

tmp += start_neg_pow2[k*2]; ?


add ax,word ptr [ebx+ecx*2]
是否应为tmp += start_neg_pow2[k*2];   ?

NO.
因为start_neg_pow2是 unsinged short(2 bytes) 指针,而不是char指针.

 楼主| 艾森豪威尔 发表于 2007-3-21 20:12 | 显示全部楼层

那为什么是k-1呢?

AA_55 发表于 2007-3-21 20:21 | 显示全部楼层

看看热闹。如果圈圈不出手,俺就眼看着楼主淹没

computer00 发表于 2007-3-21 21:07 | 显示全部楼层

估计楼主贴出的程序有点小问题

jc end_macro 应该是jnc end_macro 吧

看起来似乎是这样:


signed short neg_pow2[16]={~0x01,~0x03,~0x07,~0x0f,~0x1f,~0x3f,~0x7f,~0xff,                     ~0x1ff,~0x3ff,~0x7ff,~0xfff,~0x1fff,~0x3fff,~0x7fff,~0xFFFF};

unsigned short int wordval;


signed short get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
 signed short temp;
 temp=wordval>>(16-k);
 if(temp&(1<<(k-1)))
  {
   temp|=neg_pow2[k-1];
  }
 return temp;
}

unsigned short WORD_hi_lo(unsigned char byte_high,unsigned char byte_low)
{
 return ((unsigned short)byte_high<<8)+byte_low;
}

unsigned short lookKbits(unsigned char k)
{
 return wordval>>(16-k);
}
 楼主| 艾森豪威尔 发表于 2007-3-21 21:28 | 显示全部楼层

我可以保证我贴的程序没问题

另外wordval为unsigned int
 楼主| 艾森豪威尔 发表于 2007-3-22 08:54 | 显示全部楼层

圈圈以及各位大虾继续啊!

现在这个算法已经有点眉目了,我这是JPEG->BMP转换的代码,现在转换后的BMP已经能能出来大致的轮廓了,但是各种颜色有点混乱,请各位大虾再加把劲帮我把这个弄出来,谢谢!
 楼主| 艾森豪威尔 发表于 2007-3-22 16:36 | 显示全部楼层

顶起来

lenglx 发表于 2007-3-22 16:43 | 显示全部楼层

这样

   if(0 == tmp & ( 1<< (k-1) ) )
        tmp += start_neg_pow2[k-1];
改成试下:
   if(0 == tmp & ( 1<< (k-1) ) )
        tmp += start_neg_pow2[k];
computer00 发表于 2007-3-22 16:51 | 显示全部楼层

从他给的注释来看,不是那样子的

//Takes k bits out of the BIT stream (wordval), and makes them a signed value

我是按照这个注释来写的。

如果按照下面的程序来写,就是这样了:

signed short get_svalue(unsigned char k)
// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value
{
signed short temp;
temp=wordval>>(16-k);
if(!(temp&(1<<(k-1))))
  {
   temp|=neg_pow2[k];
  }
return temp;
}
 楼主| 艾森豪威尔 发表于 2007-3-22 19:49 | 显示全部楼层

temp|=neg_pow2[k];是对的,这个我之前试过

但是现在图片表面有一层暗绿色,原来是没有的,看起来整个图片有点发暗
lenglx 发表于 2007-3-22 19:52 | 显示全部楼层

你的意思用它的那段汇编就正常了不成?

或者它本身的那段汇编代码就有你说的那个"暗绿色"的毛病.
 楼主| 艾森豪威尔 发表于 2007-3-23 10:02 | 显示全部楼层

圈圈好像做过这个算法呀!不然怎么连那个数组都给猜对了

楼上,好像真的如你所说呀!它的算法本来就有问题。
圈圈大虾,lenglx大虾,能否给个好点的jpg->bmp的算法我呀?
xwj 发表于 2007-3-23 10:14 | 显示全部楼层

JPEG算法还是很复杂的,去这个网站看吧,太多图像方面的源

你随便找个参考一下吧:-)
 楼主| 艾森豪威尔 发表于 2007-3-23 10:26 | 显示全部楼层

多谢楼上大侠了!

可是这个网站上没有啊!
computer00 发表于 2007-3-23 12:02 | 显示全部楼层

数组是根据你的注释以及下面的程序猜出来的

// k>0 always
// Takes k bits out of the BIT stream (wordval), and makes them a signed value

注释: 从wordval位串中取出k位,并把它转化为有符号的值



你用我最先贴出的程序,就可以实现这个功能。而你的汇编程序,不能实现这个功能,
除非是注释写错了。
 楼主| 艾森豪威尔 发表于 2007-3-26 11:37 | 显示全部楼层

msn

embededman@hotmail.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

46

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部