如何将真彩色的图像变成256色的

sblt_001 2008-05-27 10:08:20
如何将真彩色的图像变成256色的

有知道的请快一点,谢谢
...全文
732 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
BORLANDSUN 2008-06-16
  • 打赏
  • 举报
回复
我的方法分两步:
一:丢弃RGB分量的低4位,只保留高4位。这样图像便从24位降低为12位(4096色)。我选取过100幅图像做过实验,一般情况下,这步操作后,图像质量能保留在30~35db,对于彩色图像,质量下降很小。
二:在上一步所获得的12位图像中,求每种色彩的直方图,选取出现色彩最多的256种颜色。用这256种颜色制作调色板,构建256色位图。对于调色板中没有的颜色,可选用12位图像中与之最接近的一种代替之。
我以前写过一篇论文,对此进行详细分析。可以把邮箱留给我。
zobin 2008-05-31
  • 打赏
  • 举报
回复
24位的可以用这个转
http://topic.csdn.net/u/20080529/14/860f0aa2-fb3b-499c-b3d1-5e83e4b504a6.html
sblt_001 2008-05-29
  • 打赏
  • 举报
回复
回15楼,你说得没有错,

失真很严重啊
现在还是人类 2008-05-28
  • 打赏
  • 举报
回复
to kghcy
===================
不好意思,以为是VB版了


同意楼上的说法:
其实256色的计算方法可以有很多种
比如按某个256色的调色板作为根据计算颜色,
也可以自动缩小使用色的范围到256色,
还可以RGB分为256段来处理,有点像固定一个调色板。
方法不同效果也不同。

我并不是迷信用API解决问题,只是因为使用API方便、高效、稳定性强(毕竟是Microsoft的东西),
在能够用API解决问题的情况,通常我不愿意用自己去作,除非想去了解这方面的东西,搞来玩玩。
当然,VC虽然我也是菜鸟,但用VC来做运算图像的DLL还是会的,
不否认VC作的速度很快,如果做得好的话很可能比API的效率还高,
但是如果自己作,就要做得比API专业,比API好,不然就没什么实用价值,
所以,通常我要用VC来做的都是API不能解决的问题,
因为如果做得不够专业,会影响整个程序的品质或稳定性,
像这样的问题Microsoft既然提供了可以解决问题的API,
我认为就用Microsoft的方案也是很好的,
除非你很自信你这方面的技术能超越Microsoft或有另类的想法,
要不就是抱着自己玩玩的心态,否则自己搞这类运算就没什么意义了。
最后建议一下,使用GDPPlus的API来解决,功能强大。
liulintao2008 2008-05-28
  • 打赏
  • 举报
回复
看过想过
学习学习
用户 昵称 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sblt_001 的回复:]
我自己也找到一种方法了

用WINDOW工具中的画板中另存为可以改变色彩
[/Quote]

那会很失真滴。
sblt_001 2008-05-28
  • 打赏
  • 举报
回复
我自己也找到一种方法了

用WINDOW工具中的画板中另存为可以改变色彩
现在还是人类 2008-05-27
  • 打赏
  • 举报
回复
楼上的,你的方法我不知道行不行,因为运算公式太多了,但是有一点可
以看出来,就是效率不高因为VB对运算小数的速度几乎是VB里其他类型的
运算最慢的,特别对图形这样大的数据量来说,效率肯定不会高到哪去。
使用 GDI+ 的API转换图像的效率最少都是你方法的20倍。
kghcy 2008-05-27
  • 打赏
  • 举报
回复
Gray = Red*0.299 + Green*0.587 + Blue*0.114
现在还是人类 2008-05-27
  • 打赏
  • 举报
回复
GDI+转换图片的例子
http://hi.baidu.com/%B3%C2%B7%E5clg/blog/item/d616c8126800f2cac2fd7863.html

比较现成的方法就是用别人开发好的组件,支持JPG、GIF的转换。
还支持绘制透明图片到原来的图片上。
推举一个:IronSoft http://www.ironsoft.cn
连ASP脚本都可以调用的COM组件,使用非常简单
现在还是人类 2008-05-27
  • 打赏
  • 举报
回复
用 GDIPlus 也就是 GDI+ 转换图片为 GIF 不就得到256色的图像了,速度有快,品质又好。
现在还是人类 2008-05-27
  • 打赏
  • 举报
回复
宝座
rover___ 2008-05-27
  • 打赏
  • 举报
回复
主要问题是真彩色中选择256色问题。要根据具体位图来做。选择好了,失真不明显,差了失真明显。
256色的意思是位图只存在256种RGB颜色。而真彩色位图中最多可以达到256^3种RGB颜色。所以主要问题是如何选举代表。原则上是最有代表性的当选。但怎样才算有代表性,仁者见仁,智者见智。方法很多。
vansoft 2008-05-27
  • 打赏
  • 举报
回复
来了,来了,让楼主久等了。
现在还是人类 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kghcy 的回复:]
公式是理论问题.
效率是实现问题.
不要乱混.

float MapR[256], MapG[256], MapB[256];
long i;
for(i=0; i <256; i++)
{
MapR[i] = i*0.299f;
MapG[i] = i*0.587f;
MapB[i] = i*0.114f;
}
BYTE *ptrI = pImage;
BYTE *ptrG = pGray;
for(i=0; i <ImageSize; i++)
{
*ptrG++ = (BYTE)(MapB[*ptrI++] + MapG[*ptrI++] + MapR[*ptrI++]);
}
不要一味迷信现有的,现有的也是程序写出来的.理论上他…
[/Quote]
废话,你答的是

Gray = Red*0.299 + Green*0.587 + Blue*0.114

已经是VB实现的方法,并没有说是理论。
而你的这段代码能属于VB的实现?

float MapR[256], MapG[256], MapB[256];
long i;
for(i=0; i <256; i++)
{
MapR[i] = i*0.299f;
MapG[i] = i*0.587f;
MapB[i] = i*0.114f;
}
BYTE *ptrI = pImage;
BYTE *ptrG = pGray;
for(i=0; i <ImageSize; i++)
{
*ptrG++ = (BYTE)(MapB[*ptrI++] + MapG[*ptrI++] + MapR[*ptrI++]);
}

你干嘛不用汇编写更加快,实现是现实的,在VB里就用VB更加适合的方法。
spritsu 2008-05-27
  • 打赏
  • 举报
回复
自己实现了一个,不过效率不是很好 ,需要的话可以提供源代码。
嗷嗷叫的老马 2008-05-27
  • 打赏
  • 举报
回复
这个LZ的提问果然牛B.
kghcy 2008-05-27
  • 打赏
  • 举报
回复
公式是理论问题.
效率是实现问题.
不要乱混.

float MapR[256], MapG[256], MapB[256];
long i;
for(i=0; i<256; i++)
{
MapR[i] = i*0.299f;
MapG[i] = i*0.587f;
MapB[i] = i*0.114f;
}
BYTE *ptrI = pImage;
BYTE *ptrG = pGray;
for(i=0; i<ImageSize; i++)
{
*ptrG++ = (BYTE)(MapB[*ptrI++] + MapG[*ptrI++] + MapR[*ptrI++]);
}
不要一味迷信现有的,现有的也是程序写出来的.理论上他可以多快,你也可以!只是你不知道而已.
别人问怎么换,你回答当然是理论公式.
别人问怎么换快些,你才能说这样好些.

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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