RBG问题(105分)

  • 主题发起人 主题发起人 whuzeng
  • 开始时间 开始时间
W

whuzeng

Unregistered / Unconfirmed
GUEST, unregistred user!
有那位高手知道如何将jpg图片转化成RBG形式来表示,即每个像素点都是RGB值,如此应该有
3个对应的二维数组,分别为R值、G值、B值数组,最好有代码!不知大富翁是否真有高手能解决?
 
什么rgb,是不是 转化颜色值?
 
你要处理什么?没有必要分成单独的三个二维数组吧?可以把整幅图片存在一个二维数组里.
JPG需要JPEG.PAS支持,如果程序包了这个单元,可从OPENDISLOG直接打开并将其转换为BMP格式
参考源码:
unit Unit1;

interface

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

type
TRGBArray = ARRAY[0..32767] OF TRGBTriple;//定义一维数组,每元素为TRGBTriple类
pRGBArray = ^TRGBArray;

implementation

{$R *.DFM}

procedure TForm1.CopyMe(tobmp: TBitmap; frbmp : TGraphic);
begin
tobmp.Width := frbmp.Width;
tobmp.Height := frbmp.Height;
tobmp.PixelFormat := pf24bit;
tobmp.Canvas.Draw(0,0,frbmp);
end;
//打开图片并完成转换JPG->BMP
procedure TForm1.Button2Click(Sender: TObject);
var
B : pRGBArray; // Scanlines
x, y : integer;
begin
if OpenPictureDialog1.Execute then begin
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
CopyMe(OriginalBMP,Image1.Picture.Graphic);

//对OriginalBMP进行处理

for y := 0 to OriginalBMP.Height - 1 do begin // Walk scanlines
B := OriginalBMP.ScanLine[y]; //逐行扫描
// Now do the main piece
for x:= 1 to OriginalBMP.Width - 1 do begin // 处理每一个象素
Temp1[x,y]:= B[x].rgbtRed ; //分别取每个象素的R、G、B值,在这里把它们分别赋给三个不同的二维数组
.....:= B[x].rgbtgreen ;
.....:= B[x].rgbtBlue ;
end;
end;
end;




 
我想获得两幅图的RGB值,然后进行每个像素比较,来发现两幅图的差异。好像可以将256色的
降为32色,即256的3次方除以32,将RGB值分配到这32个单元中,不过每个R、G、B、值都是0~255
怎么分配呢?有些模糊!
 
应该是你要的函数啦,在里面。
unit Ugetcor;

interface

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, Buttons, Menus, clipbrd;

type
Tgetcol = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
procedure FormClick(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormResize(Sender: TObject);
private
tx,ty : integer;
procedure WMEraseBkng(var MSg:TWMEraseBkgnd);message WM_ERASEBKGND;
public
{ Public declarations }
end;

var
getcol: Tgetcol;
implementation

{$R *.DFM}
const
Digits : array[0..$F] of Char = '0123456789ABCDEF';

function HexB(B : Byte) : string;
{-Return hex string for byte}
begin
//HexB[0] := #2;
//HexB[1] := Digits[B shr 4];
//HexB[2] := Digits[B and $F];
//Delphi5将上三行改为:
HexB:=Digits[B shr 4]+Digits[B and $F];
end;

procedure Tgetcol.WMEraseBkng(var MSg:TWMEraseBkgnd);
begin
Msg.Result:=1;
end;

procedure Tgetcol.FormClick(Sender: TObject);
var t : tcolor;
r,g,b : byte;
clip:tclipboard;
begin
t := canvas.pixels[tx,ty];
r := getRvalue(t);
g := getGvalue(t);
B := getBvalue(t);
LABEL2.COLOR := T;
LABEL1.CAPTION := HEXB(R) + HEXB(G) + HEXB(B);
clip:=tclipboard.create;
clip.astext:=label1.caption;
clip.Free;
end;

procedure Tgetcol.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
tx := x;
ty := y;
end;
end.
 
你的代码我试过了,并没有将一张图片都转换成RBG形式阿!我需要的是一个二维数组形式来存储图片,每个
单元都是RBG值!比如800×600的就有4800000个RBG值!我这样的理解有误吗?
 
24位的图象也就是一个象素点有R,G,B三个分量,先转为bmp格式,bmp.pixformat:=pf24bit;
 
这个我知道,然后呢?
 
接受答案了.
 
阿真是who?没有回答问题就得分,是不是楼主自己的马甲?这样太没有意思了,不想给就和斑竹说一声
大家也不会介意的,这种操作实在汗颜!以后估计没有人会回答问题了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部