Delphi将像素颜色写入备忘录

时间:2015-03-17 11:26:58

标签: windows delphi delphi-xe7

我想制作一个程序,可以将我的TImage像素rgb颜色写入备忘录,程序不知道分辨率。

那么如何将每个像素颜色恢复为String变量(R,G,B)?

var 
Image_width,Image_height,x,y,i,i2:integer;
Colors:TColor;

begin
Image_width:=Image1.Width;
Image_height:=Image1.Height;
memo1.text:='$image_width=*'+IntToStr(Image_Width)+
            '$$image_height='+IntToStr(Image_Height)+'*$';
x:=1;
y:=1;
for i := 1 to Image_width do begin
 for i2 := 1 to Image_height do begin
  Colors:=Image1.Canvas.Pixels[x,y];
  memo1.Text:=memo1.Text+ColorToString(Colors);
  y:=y+1;
 end;
 x:=x+1
end;
end

|编辑|

procedure TForm1.Button2Click(Sender: TObject);
var
Image_width,Image_height,x,y:integer;
Colors:TColor;
s:string;
begin

 Image_width:=Image1.Width;
 Image_height:=Image1.Height;



 memo1.text:='$image_width=*'+IntToStr(Image_Width)
            +'*$ $image_height=*'+IntToStr(Image_Height)+'*$';


x:=0;
y:=0;

memo1.Lines.BeginUpdate;
for x := 0 to Image_width do begin
    for y := 0 to Image_height do begin
     Colors:=Image1.Canvas.Pixels[x,y];
     memo1.Text:=Memo1.Text+ColorToString(Colors);

    end;
memo1.Lines.EndUpdate;
end;
end;

它完成得很慢,我觉得19秒,640x480图片。 在程序准备好之后,它放到memo1,我在memo1中看到了一些内容,但程序“没有响应”了......

我尝试使用s变量,程序也这样做。

1 个答案:

答案 0 :(得分:2)

第一次修正,像素从0开始,0不是1,1,因为你有。在for循环之前替换初始值,如下所示:

  x := 0; // not 1;
  y := 0; // not 1;

实际上,此时不需要分配y,我们很快就会看到。

第二次修正,仔细查看内部for循环。 i2从1步进到Image_height,y在循环的每一轮中递增,这没关系。然后访问外部循环增加x,我们返回内部循环。 y会发生什么?它从之前停止的地方继续,而它应该首先重置为0.固化是按如下方式添加一条线。这也是上述任务多余的原因。

  for i := 1 to Image_width do
  begin
    y := 0; // Add this line
    for i2 := 1 to Image_height do
    begin

改进建议

目前还不清楚resolution未知是什么意思。如果您的意思是颜色深度或每像素位数,那么使用pixels的方法可能更直接。否则,正如评论中所建议的那样,您可以考虑使用扫描线而不是像素来更快地访问实际的位图数据。有关优秀文章,请参阅:How to use ScanLine property for 24-bit bitmaps?

将颜色字符串重复连接到Text属性非常慢。事实上,64 x 64像素图像速度太慢,我无法等待它运行到最后。为了加快速度,您可以使用单独的string变量来连接颜色字符串

  Colors := Image1.Canvas.Pixels[x, y];
  s := s + ColorToString(Colors);

然后循环连接到Text属性

  Memo1.Text := Memo1.Text + s;

如果您打算将每个像素colorstring添加为备忘录的新行,则可以改为使用Add方法

  Colors := Image1.Canvas.Pixels[x, y];
  Memo1.Lines.Add(ColorToString(Colors));

使用forMemo1.Lines.BeginUpdate;围绕Memo1.Lines.EndUpdate;循环可进一步提高速度。

最后,您也可以使用xy作为循环控制变量,或使用ii2作为像素索引。我会抛弃ii2,并使用xy作为循环控制变量和像素索引。但是我留给你决定。