long Gray;
    BYTE    *ptr;
    Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap;
    tmpBitmap->Assign((TPersistent *)Image1->Picture->Graphic);
    tmpBitmap->PixelFormat = pf24bit;
    for (int y = 0; y < tmpBitmap->Height; y++)
    {
        ptr = (BYTE *)tmpBitmap->ScanLine[y];
        for (int x = 0; x < tmpBitmap->Width *3; x+=3)
        {
            Gray = 299*ptr[x+2]+587*ptr[x+1]+114*ptr[x];
            ptr[x]= Gray/1000;
            ptr[x+1] = Gray/1000;
            ptr[x+2] = Gray/1000;
        }
        Image1->Picture->Graphic = tmpBitmap;
        //delete tmpBitmap;

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var bmp:TBitmap;Ptr:PByteArray;x,y:integer;gray:integer;
    begin
      bmp:=tbitmap.Create;
      bmp.Assign(image1.Picture.Graphic);
      bmp.PixelFormat:=pf24bit;
      for y:=0 to bmp.Height-1 do
      begin
        ptr:=bmp.ScanLine[y];
        x:=0;
        while x<bmp.Width-1 do
        begin
          Gray:=299*ptr[x+2]+587*ptr[x+1]+114*ptr[x];
          ptr[x]:=Gray div 1000;
          ptr[x+1]:=Gray div 1000;
          ptr[x+2]:=Gray div 1000;
          x:=x+3;;
        end;
      end;
      image2.Picture.Assign(bmp);
      bmp.Free
    end;