我想制作一个程序,可以将我的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变量,程序也这样做。
答案 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));
使用for
和Memo1.Lines.BeginUpdate;
围绕Memo1.Lines.EndUpdate;
循环可进一步提高速度。
最后,您也可以使用x
和y
作为循环控制变量,或使用i
和i2
作为像素索引。我会抛弃i
和i2
,并使用x
和y
作为循环控制变量和像素索引。但是我留给你决定。