请教大虾们,如何得到图像上某一点的RGB值?(100分)

  • 主题发起人 主题发起人 GoogolLee
  • 开始时间 开始时间
G

GoogolLee

Unregistered / Unconfirmed
GUEST, unregistred user!
如何快速获得bitmap:tbitmap图像上某一点的RGB值?
hPalette的格式是什么?
 
function GetColor(const ACanvas:tCanvas;x,y:integer):TColor;
begin
result := ACanvas.pixels[x,y];
end;

x,y就是你要的点的位置
 
同意cgh0717的说法,其实不用使用函数,直接调用即可。
 
同意cgh0717的说法。
 
如果是Bitmap,建议使用TBitmap.ScanLine
 
给你一个灰度化图片的例子,其实就是改变没一点的RGB值;
var
i,j:integer;
p:pchar;
c:byte;
begin
abmp.HandleType := bmDIB;
abmp.PixelFormat := pf24bit;
for i:=0 to abmp.Height-1 do
begin
p := abmp.ScanLine;
for j:=1 to abmp.Width do
begin
c := (integer(p^)*rx+integer((p+1)^)*gx+integer((p+2)^)*bx) div xx;
if not(c<255) then c := 255;
p^ := chr(c); //
(p+1)^ := chr(c); //
(p+2)^ := chr(c); //这里存储了RGB的值
inc(p,3);
end;
end;
 
To terry_lzs,
同志,Copy时细心点 ->
procedure ToGray(abmp:TBitmap;rx,gx,bx,xx:integer);

--------------------
用 ...Canvas.pixels[x,y]; 取值
用 ...Canvas.pixels[x,y]:=RGB(r,g,b);赋值(r,g,b:BYTE)
---------------------
>>hPalette的格式是什么?
...Bitmap..hPalette,指调色板句柄,你可以用
SetPalette API 改变象素的亮度对比度,
用SetPalette检索一下,有一个关于Palette的结构体(关于R,G,B亮度的)
MSDN有的,如果你装了CBuild,Delphi 肯定有的
 
如果从hPalette直接存取rgb值应如何?还有,要得到某一点的调色板索引又如何?
windows中默认的20种颜色在256和其他格式中是如何存储的?
 
RGB * m_pRgb ;
m_pRgb = GetPxiel(bitmap->Canvas->Handle,X,Y);
if(m_pRgb != CLR_INVALID )
// RGB 值有效,
else
// RGB 值无效.


 
给你的一个例子:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
jpeg, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
red,green,blue:byte ;
i:integer;
begin
i:= image1.Canvas.Pixels[x,y];
Blue:= i div 65536;
Green:=i div 256-red;
Red:=i mod 256 ;
Label1.Caption:=inttostr(Red);
Label2.Caption:=inttostr(Green);
Label3.Caption:=inttostr(Blue);
end;

end.

 
不好意思,需要把 “Green:=(i div 256) - red ” 改为 Green:=(i div 256) - Blue

当然你的image应该调用的是bmp文件!
 
呵呵
ColorToRGB function
查一下Delphi的help
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
red,green,blue:byte ;
i:integer;
begin
i:= image1.Canvas.Pixels[x,y];
Blue:= GetBValue(i);
Green:= GetGValue(i):
Red:= GetRValue(i);
Label1.Caption:=inttostr(Red);
Label2.Caption:=inttostr(Green);
Label3.Caption:=inttostr(Blue);
end;
 
多人接受答案了。
 
后退
顶部