给定一个调色板,如HPalette, 怎么才能知道这是多少颜色的调色板,如256色,32色,16色?(100分)

P

pengyt

Unregistered / Unconfirmed
GUEST, unregistred user!
给定一个调色板,如HPalette, 怎么才能知道这是多少颜色的调色板,如256色,32色,16色?
 
1、你的问题提问的不对哦
对于24位及以上的图,是不要调色板的,但对于256色以下的,一般只用1个字节表示颜色,
那么既然只用一个字节表示,它的R,G,B是多少呢?这就需要一个表,通过这个表可以查
到它的所代表的R,G,B的值,这个表就是调色板。
2、这样来:

var
palette:hpalette;
entries:array[0..255] of TPaletteEntry;
number :Integer;

number :=GetPaletteEntries(palette,0,256,entries);
 
我的意思是256色以下的图都有调色板,比如可以是16色的图,32色的图等,
那么我是否可以根据这个图的调色板知道这个图到底是16还是32色的呢?
比如
Bmp: TBitmap;
是否可以用 number :=GetPaletteEntries(Bmp.palette,0,256,entries); 得出
Bmp的颜色深度呢? (pixelformat=pfDevice)
 
不行啊,
procedure TForm1.Button1Click(Sender: TObject);
var
mIcon: TIcon;
palette:hpalette;
entries:array[0..255] of TPaletteEntry;
number :Integer;
mBmp: TBitmap;
begin
mIcon:=TIcon.Create;
mBmp:=TBitmap.Create;
try
mIcon.LoadFromFile('c:/1.ico');

mBmp.Width:=32;
mBmp.Height:=32;
mBmp.Canvas.Draw(0,0,mIcon);
palette:=mBmp.Palette;
number:=GetPaletteEntries(mBmp.Palette,0,256,entries);
finally
mIcon.Free;
mBmp.Free;
end;
edit1.text:=inttostr(number);
end;

Edit 一直显示 0,并没有返回任何别的值
 
怎么?有什么问题么?

我写的完全可以 :

procedure TForm1.Button1Click(Sender: TObject);
var
palette:hpalette;
entries:array[0..255] of TPaletteEntry;
number :Integer;
begin
palette :=Image1.Picture.Bitmap.Palette;
number :=GetPaletteEntries(palette,0,256,entries);
ShowMessage(IntToStr(number));
end;

如果你需要256色、16色图片,我发给你。留下 mail .
 
找张图片在画图里另存一下就行了
 
procedure TForm1.Button1Click(Sender: TObject);
var
mIcon: TIcon;
palette:hpalette;
entries:array[0..255] of TPaletteEntry;
number :Integer;
begin
mIcon:=TIcon.Create;
try
mIcon.LoadFromFile('c:/1.ico');
number:=GetPaletteEntries(mIcon.Palette,0,256,entries);
finally
mIcon.Free;
end;
edit1.text:=inttostr(number);
end;

如果是上面的情况,返回值一直为0, 难道Tbitmap和TIcon的palette不同吗?
 
不同!

你可以这样处理:首先将ICON转换为BMP,这个转换你可以去搜索,以前我写过的。
 
我已经写过一次了,应该是这样吧.问题是这样并不能解决问题
mBmp.Canvas.Draw(0,0,mIcon);

完整代码
procedure TForm1.Button1Click(Sender: TObject);
var
mIcon: TIcon;
palette:hpalette;
entries:array[0..255] of TPaletteEntry;
number :Integer;
mBmp: TBitmap;
begin
mIcon:=TIcon.Create;
mBmp:=TBitmap.Create;
try
mIcon.LoadFromFile('c:/1.ico');

mBmp.Width:=32;
mBmp.Height:=32;
mBmp.Canvas.Draw(0,0,mIcon);
palette:=mBmp.Palette;
number:=GetPaletteEntries(mBmp.Palette,0,256,entries);
finally
mIcon.Free;
mBmp.Free;
end;
edit1.text:=inttostr(number);
end;
 
兄弟啊!
你这样写mBmp.Canvas.Draw(0,0,mIcon);其实根本就没有什么效果啊!
你的转换是对的,但是你应该重新载入!
就是说你在将ICO转换为BMP以后,需要保存、加载。
mBmp.SaveToFile('....bmp');
mBmp.LoadFromFile('....bmp');

我建议你可以这样,对一个ICO,你拿到ACDSEE里去另存为BMP,你来判断这个BMP的颜色数!
完全可以!
 
接受答案了.
 

Similar threads

I
回复
0
查看
715
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
1K
import
I
顶部