- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在网上搜索了几个小时,但找不到任何有关如何从 TPicture.Graphic 获取调色板的信息。我还需要获取颜色值,以便可以将这些值传递到 TStringList 以填充颜色选择器中的单元格。
这是我目前拥有的代码:
procedure TFormMain.OpenImage1Click( Sender: TObject );
var
i: integer;
S: TStringList;
AColor: TColor;
AColorCount: integer;
N: string;
Pal: PLogPalette;
HPal: hPalette;
begin
if OpenPictureDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
try
Pal := nil;
try
S := TStringList.Create;
ABitmap.Free; // Release any existing bitmap
ABitmap := TBitmap.Create;
Image1.Picture.LoadFromFile( OpenPictureDialog1.Filename );
ABitmap.Canvas.Draw( 0, 0, Image1.Picture.Graphic );
GetMem( Pal, Sizeof( TLogPalette ) + Sizeof( TPaletteEntry ) * 255 );
Pal.palversion := $300;
Pal.palnumentries := 256;
for i := 0 to 255 do
begin
AColor := Pal.PalPalEntry[ i ].PeRed shl 16 + Pal.PalPalEntry[ i ].PeGreen shl 8 + Pal.PalPalEntry[ i ].PeBlue;
N := ColorToString( AColor );
S.Add( N );
end;
HPal := CreatePalette( Pal^ );
ABitmap.Palette := HPal;
Memo1.Lines := S;
finally; FreeMem( Pal ); end;
S.Free;
finally; Screen.Cursor := crDefault; end;
end;
end;
我正在使用 Image1.Picture.Graphic 中包含的图像绘制到 ABitmap 的 Canvas 上,因为我想支持所有 TPicture 图像类型,例如 Bitmap、Jpeg、PngImage 和 GIfImg。
如有任何帮助,我们将不胜感激。我走在正确的道路上还是需要一些不同的东西?
最佳答案
您发布的代码实际上没有任何作用。您要么必须从位图中读回调色板,然后才能访问它,要么需要创建一个调色板并将其分配给位图 - 您的代码两者都不会。
以下代码或多或少是您的代码,其中 fBitmap
和 fBitmapPalEntries
字段用于操作结果。我评论了我更改的所有行:
if OpenPictureDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
try
Pal := nil;
try
S := TStringList.Create;
fBitmap.Free; // Release any existing bitmap
fBitmap := TBitmap.Create;
// if you want a 256 colour bitmap with a palette you need to say so
fBitmap.PixelFormat := pf8bit;
Image1.Picture.LoadFromFile( OpenPictureDialog1.Filename );
fBitmap.Canvas.Draw( 0, 0, Image1.Picture.Graphic );
// access the palette only if bitmap has indeed one
if fBitmap.Palette <> 0 then begin
GetMem( Pal, Sizeof( TLogPalette ) + Sizeof( TPaletteEntry ) * 255 );
Pal.palversion := $300;
Pal.palnumentries := 256;
// read palette data from bitmap
fBitmapPalEntries := GetPaletteEntries(fBitmap.Palette, 0, 256,
Pal.palPalEntry[0]);
for i := 0 to fBitmapPalEntries - 1 do
begin
AColor := Pal.PalPalEntry[ i ].PeRed shl 16
+ Pal.PalPalEntry[ i ].PeGreen shl 8
+ Pal.PalPalEntry[ i ].PeBlue;
N := ColorToString( AColor );
S.Add( N );
end;
// doesn't make sense, the palette is already there
// HPal := CreatePalette( Pal^ );
// fBitmap.Palette := HPal;
Memo1.Lines := S;
end;
finally; FreeMem( Pal ); end;
S.Free;
finally; Screen.Cursor := crDefault; end;
end;
支持较少条目的调色板很容易,您只需在知道有多少条目后重新分配内存,例如
ReallocMem(Pal, SizeOf(TLogPalette) + SizeOf(TPaletteEntry) * (fBitmapPalEntries - 1));
仅当您想以 pf4Bit
或 pf8Bit
格式编写位图时,才需要创建调色板。您可能需要通过减少颜色数量(抖动)来确定调色板条目的 16 或 256 种颜色。然后,您将使用颜色值填充调色板颜色槽,最后使用我从代码中注释掉的两行。您必须确保位图的像素格式和调色板条目的数量匹配。
关于delphi - 如何访问 TPicture.Graphic 的调色板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1240673/
我对 delphi 完全陌生,我有一个项目,需要将图片从指针加载到保存原始像素数据的 C 数组。 我不能简单地使用TPicture.LoadFromFile,因为实际加载是在 C++ DLL 中执行的
我正在遍历表单的控制列表,当我找到 TPicture 时,我想更改属性(图像,但任何示例都可以)。 我该如何编码? TPciture 和 TControl 似乎不兼容。我可以以某种方式转换吗? 更新:
如何从 TImageList 中获取 TPicture? 我需要做Image1.Picture:=...TPicture从图像列表中,将图像加载到 TImage 中。 图像列表存储我所有透明的 PNG
我在网上搜索了几个小时,但找不到任何有关如何从 TPicture.Graphic 获取调色板的信息。我还需要获取颜色值,以便可以将这些值传递到 TStringList 以填充颜色选择器中的单元格。 这
如何将已在 TWebBrowser 中下载的图像获取到 TPicture,而不将其复制到剪贴板或查找缓存内容。 最佳答案 好的,我用最后一个答案制作了样本: 首先使用此函数通过 Id 获取图像: fu
这是我的组件整体结构: 我的组件 属性类别:TCollection(TCategory 的) T类别 属性Icon: TPicture 读FIcon 写SetIcon; 属性示例:整数读取 FExam
我使用此代码将透明 png 转换为 32 bpp bmp。 var Picture : TPicture; BMP : TBitmap; begin Picture := TPi
使用 Delphi 7。我有一个简单的例程成功加载 .bmp , .emf , .wmf , .ico和 .jpg文件(下面给出的代码)。我的问题是每个 .ico (图标)文件总是报告 TImage.
我是一名优秀的程序员,十分优秀!