怎样可将24位位图转换成256色位图而失色不厉害?

zhangjm 2000-09-13 10:42:00
我想将24位的位图转换成256色的位图,以便用Gif的文件格式来存储。不知怎样制作调色板,使得转换比较快且失色不是很厉害?若有函数可调用更好!
谢谢!
...全文
721 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
potatopro 2000-09-15
  • 打赏
  • 举报
回复
找了一个以前的程序,算法简单,效果也可以。

unsigned char* Color256(int sourcelen,int sourcewid)
{
int Colorcount[4096];
short Colorindex[4096];
unsigned char *buff;
buff=new unsigned char[sourcelen*sourcewid*3];
Contensta=new unsigned char[sourcelen*sourcewid];
memset(Colorindex,0,4096*sizeof(short));
memset(Colorcount,0,4096*sizeof(int));
fseek(fpsource,54,0);
fread(buff,1,sourcelen*sourcewid*3,fpsource);
int i,j;
int blue,green,red,clrindex,colornum=0;
struct panel{
int blue;
int green;
int red;
}pan[256];
for(i=0;i<sourcelen*sourcewid*3;)
{
blue=buff[i++]&0xf0;
green=buff[i++]&0xf0;
red=buff[i++]&0xf0;
clrindex=(blue<<4)+green+(red>>4);
Colorcount[clrindex]++;
}
for(i=0;i<4096;i++)
{
if(Colorcount[i]!=0)
{
Colorcount[colornum]=Colorcount[i];
Colorindex[colornum]=short(i);
colornum++;
}
}
quicksort(Colorcount,Colorindex,0,colornum-1);

for(i=0,j=0;i<256;i++)
{
bmphead[54+j++]=(Colorindex[colornum-i-1]&0xf00)>>4;
bmphead[54+j++]=(Colorindex[colornum-i-1]&0x0f0);
bmphead[54+j++]=(Colorindex[colornum-i-1]&0x00f)<<4;
bmphead[54+j++]=0;
Colorcount[colornum-i-1]=i;
pan[i].blue=(Colorindex[colornum-i-1]&0xf00)>>4;
pan[i].green=(Colorindex[colornum-i-1]&0x0f0);
pan[i].red=(Colorindex[colornum-i-1]&0x00f)<<4;
}
if(colornum>256)
{
int Colorerror,Colorerr;
for(i=0;i<colornum-256;i++)
{
Colorerr=1000000;
blue=(Colorindex[i]&0xf00)>>4;
green=(Colorindex[i]&0x0f0);
red=(Colorindex[i]&0x00f)<<4;
clrindex=0;
for(j=0;j<256;j++)
{
Colorerror=(blue-pan[j].blue)*(blue-pan[j].blue)+
(green-pan[j].green)*(green-pan[j].green)+
(red-pan[j].red)*(red-pan[j].red);
if(Colorerror<Colorerr)
{
Colorerr=Colorerror;
clrindex=j;
}
}
Colorcount[i]=clrindex;
}
}
for(i=0;i<sourcelen*sourcewid*3;)
{
blue=buff[i++]&0xf0;
green=buff[i++]&0xf0;
red=buff[i++]&0xf0;
clrindex=(blue<<4)+green+(red>>4);
for(j=colornum-1;j>=0;j--)
if(clrindex==Colorindex[j])
{
Contensta[sourcewid*(sourcelen-(i-)/3/sourcewid-1)+(i-3)/3%sourcewid]=(unsigned char)(Colorcount[j]);
break;
}
}
delete buff;
return Contensta;
}
potatopro 2000-09-15
  • 打赏
  • 举报
回复
这里有过好多这类帖子,可以查一查。
wolfop 2000-09-15
  • 打赏
  • 举报
回复
但是想作到很好的效果, 估计还是不大可能的.
现在都什么时代了, 为什么还用256色呢?
还有tchaikov提出的方法估计购呛, 还不如选择合适的调色板, 这种衰减太过分了.
wolfop 2000-09-15
  • 打赏
  • 举报
回复
但是想作到很好的效果, 估计还是不大可能的.
现在都什么时代了, 为什么还用256色呢?
tchaikov 2000-09-15
  • 打赏
  • 举报
回复
我以前做过同样的东西,但不能符合你的要求:速度快!
PHOTOSHOP进行转换也不快呀!

如果速度要求快,可以考虑将R色其中的3bit,G色其中的3bit,B色其中的2bit合并成一个byte(蓝色敏感都差些),这样组成256色,具体是怎么个处理过程我只是见过,给忘了!
ywbby 2000-09-15
  • 打赏
  • 举报
回复
关注!
SCUM 2000-09-15
  • 打赏
  • 举报
回复
几年前有一个流行于 DOS 世界的 Alchemy,现在已公开源码(Linux),参考一下应该有
帮助的。它支持的图像格式超过 50 种,单色至 24 位色。
缩放也有。
No9 2000-09-14
  • 打赏
  • 举报
回复
关注!
我还想知道如何在有比例的缩小图标时,尽量不失真的方法?
shines77 2000-09-14
  • 打赏
  • 举报
回复
关注,关键是通过计算怎么合并调色板。
Holly 2000-09-13
  • 打赏
  • 举报
回复
Attention!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧