unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
const BmpPath = 'C:\Temp\Test.bmp';procedure TForm1.Button1Click(Sender: TObject);
var
  bit: TBitmap;
  clr: TColor;
  X,Y:INTEGER;
  pixels: TStrings;
begin
  X:=STRTOINT(EDIT1.TEXT);
  Y:=STRTOINT(EDIT2.TEXT);
  bit := TBitmap.Create;
  bit.LoadFromFile(BmpPath);      {载入图片}
  clr := bit.Canvas.Pixels[X,Y]; {获取第一像素的颜色值}
  ShowMessageFmt('%.6x', [clr]); {显示为十六进制字符串看看}
  pixels:= TStringList.Create;
  pixels.Add(ColorToString(clr));
  pixels.SaveToFile('c:\temp.txt');
  pixels.Free;
  //Self.Color := clr;            {可用窗体呈现一下}
  bit.Free;
end;end.我有在“clr := bit.Canvas.Pixels[X,Y]; ”前面加“for i:=0 to bit.width-1 do"
                                              "for j:=0 to bit.height-1 do"
但是这样还是不能保存。请高手帮我指点指点!谢谢!!!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      bit: TBitmap;
      clr: TColor;
      X,Y:INTEGER;
      pixels: TStrings;
    begin
      X:=STRTOINT(EDIT1.TEXT);
      Y:=STRTOINT(EDIT2.TEXT);
      bit := TBitmap.Create;
      bit.LoadFromFile(BmpPath);      {载入图片}
      clr := bit.Canvas.Pixels[X,Y]; {获取第一像素的颜色值}
      ShowMessageFmt('%.6x', [clr]); {显示为十六进制字符串看看}
      pixels:= TStringList.Create;
      for i := 0 to bit.Width - 1 do
        for j := 0 to bit.Height - 1 do
        begin
          clr := bit.Canvas.Pixels[i, j];
          pixels.Add(ColorToString(clr));
        end;
      pixels.SaveToFile('c:\temp.txt');
      pixels.Free;
      //Self.Color := clr;            {可用窗体呈现一下}
      bit.Free;
    end; 
      

  2.   

    如果想要一行一行的保存可以这样:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bit: TBitmap;
      clr: TColor;
      X,Y:INTEGER;
      s: string;
      pixels: TStrings;
    begin
      X:=STRTOINT(EDIT1.TEXT);
      Y:=STRTOINT(EDIT2.TEXT);
      bit := TBitmap.Create;
      bit.LoadFromFile(BmpPath);      {载入图片}
      clr := bit.Canvas.Pixels[X,Y]; {获取第一像素的颜色值}
      ShowMessageFmt('%.6x', [clr]); {显示为十六进制字符串看看}
      pixels:= TStringList.Create;
      for i := 0 to bit.Width - 1 do
      begin
        s := '';
        for j := 0 to bit.Height - 1 do
        begin
          clr := bit.Canvas.Pixels[i, j];
          s := s + ColorToString(clr) + '  ';
        end;
        pixels.Add(s);
      end;
      pixels.SaveToFile('c:\temp.txt');
      pixels.Free;
      //Self.Color := clr;            {可用窗体呈现一下}
      bit.Free;
    end; 
      

  3.   

    不好意思,我可能没说清楚题目。我是要任意提取我在EDIT1与EDIT2中输入的点的像数,而不是要提取整行或整列的,只要几个点。
    就是我在EDIT里面输入(1,0),(40,94),(3,100)......这样的坐标,就可以保存在temp.txt里面。但是点是任意的点。懂了吗?谢谢!
    可能不是用“for i:=0 to bit.width-1 do" 
            "for j:=0 to bit.height-1 do"。
      

  4.   

    假设你在Edit中输入的'('、','为半角procedure TForm1.Button1Click(Sender: TObject);
      procedure SavePixel(AEdit: TEdit; ABitmap: TBitmap; AStrings: TStrings);
      var
        text, s: string;
        i, x, y: Integer;
        clr: TColor;
      begin
        text := StringReplace(AEdit.Text, ' ', '', [rfReplaceAll]);
        text := StringReplace(text, '(', '', [rfReplaceAll]);
        text := StringReplace(text, ')', '', [rfReplaceAll]);
        i := Pos(',', text);
        s := Copy(text, 1, i - 1);
        x := StrToInt(s);
        s := Copy(text, i + 1, Length(text) - i);
        y := StrToInt(s);
        if (x >= 0) and (x < ABitmap.Width) and (y >= 0) and (y < ABitmap.Height) then
        begin
          clr := ABitmap.Canvas.Pixels[x, y];
          AStrings.Add(ColorToString(clr));
        end;
      end;var
      bmp: TBitmap;
      pixels: TStrings;
    begin
      bmp := TBitmap.Create;
      bmp.LoadFromFile(BmpPath);
      pixels := TStringList.Create;
      SavePixel(Edit1, bmp, pixels);
      SavePixel(Edit2, bmp, pixels);
      pixels.SaveToFile('c:\temp.txt');
      bmp.Free;
      pixels.Free;
    end;
      

  5.   

    大哥,我是要在EDIT1里输入x的坐标和EDIT2里输入Y的坐标,然后按下BUTTON1以后,EDIT1和EDIT2的坐标所对应的像数点(RGB)就被保存在TEMP.TXT里面。但是我不只是提取一个点,而是多个点,而且是我任意在EDIT1和EDIT2输入点坐标,就可以依次按顺序的保存!
    你刚写的那个代码我放到DELPHI里面不行啊!麻烦你了!!
      

  6.   

    大哥,我不会改啊.我有想在第二个的VAR下面改,但是不行啊!
    麻烦你帮我改下吧.我很急啊!
    就是让我可以在EDIT里面输入X,Y的坐标,然后可以读取其RGB,而且是输入的点的次数(就是输入的总共的点数)最少点为1次,最多点为图的长乘以宽次.
    麻烦你啊!我现在在赚分了,到时会给你加分的.谢谢了!!
      

  7.   

    "而且是输入的点的次数(就是输入的总共的点数)最少点为1次,最多点为图的长乘以宽次",这是在一个Edit中输入多个坐标?坐标格式是怎么样的。
      

  8.   

    是在两个Edit中分别输入X、Y坐标?坐标间用事实号分离?
      

  9.   

    是在两个Edit中分别输入X、Y坐标?坐标间用逗号分离? 
      

  10.   

    我最早的代码(就是我发的那代码)就是在edit1里面输入X坐标,在edit2里面输入Y坐标,然后按下BUTTON1以后就能读出图片上该点的坐标的RGB,所以我现在就是要在第一次按下button1后可以继续输入新的X以及Y的坐标,又在按下BUTTON1,又可以得到另一个点的坐标的RGB,如此循环的输入坐标,按下button1,得到更多任意的点(有可能要上千个点,也有可能就一个点)。并且所得到的坐标对应的RGB要按顺序保存在TXT里面。
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      bit: TBitmap;
      clr: TColor;
      X,Y:INTEGER;
      pixels: TStrings;
    begin
      X:=STRTOINT(EDIT1.TEXT);
      Y:=STRTOINT(EDIT2.TEXT);
      bit := TBitmap.Create;
      bit.LoadFromFile(BmpPath);      {载入图片}
      clr := bit.Canvas.Pixels[X,Y]; {获取第一像素的颜色值}
      ShowMessageFmt('%.6x', [clr]); {显示为十六进制字符串看看}
      pixels:= TStringList.Create;
      pixels.Add(ColorToString(clr));
      pixels.SaveToFile('c:\temp.txt');
      pixels.Free;
      //Self.Color := clr;            {可用窗体呈现一下}
      bit.Free;
    end;这段代码没什么问题啊,取出坐标对应的像素,然后保存。
      

  12.   

    你想继续提取,就清除Edit的内容继续输入不就行了,然后点击按钮就又获得一个颜色了。
      

  13.   

    //这样就行了。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bit: TBitmap;
      clr: TColor;
      X,Y:INTEGER;
      pixels: TStrings;
    begin
      X:=STRTOINT(EDIT1.TEXT);
      Y:=STRTOINT(EDIT2.TEXT);
      bit := TBitmap.Create;
      bit.LoadFromFile(BmpPath);      {载入图片}
      clr := bit.Canvas.Pixels[X,Y]; {获取第一像素的颜色值}
      pixels:= TStringList.Create;
      pixels.Add(IntToHex(clr, 0));
      pixels.SaveToFile('c:\temp.txt');
      pixels.Free;
      bit.Free;
    end; 
      

  14.   

    不好意思,我知道哪里错了,太丢人了。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bit: TBitmap;
      clr: TColor;
      X,Y:INTEGER;
      pixels: TStrings;
    begin
      X:=STRTOINT(EDIT1.TEXT);
      Y:=STRTOINT(EDIT2.TEXT);
      bit := TBitmap.Create;
      bit.LoadFromFile(BmpPath);      {载入图片}
      clr := bit.Canvas.Pixels[X,Y]; {获取第一像素的颜色值}
      pixels:= TStringList.Create;
      if FileExists('c:\temp.txt') then
        pixels.LoadFromFile('c:\temp.txt');
      pixels.Add(IntToHex(clr, 0));
      pixels.SaveToFile('c:\temp.txt');
      pixels.Free;
      bit.Free;
    end;
      

  15.   

    忘记判断c:\temp.txt是否存在了,所以你一直只能保存一个像素点的颜色。
      

  16.   

    大哥,你知道要如何能将程序中的两个edit改成用Memo来输入点的坐标吗?就是原来是用EDIT1输入x坐标,EDIT2输入Y坐标,能改成坐标都在Memo里面输入,然后输入形式为(x1,y1)(x2,y2)....(xn,yn)这样的形式吗,然后按下BUTTON后就可以提取出所有输入的点的RGB?这样提取的时候比原来的清楚。