一张有文字的单色图片
文字是一种颜色,背景图片是一种颜色,
现在想将原来的每个象素显示文字的部分用1表示,显示图片的部分用0表示
0000000000000000
0000100000000000
0000100000000000
0000100000000000类似这样
原来的图片是16位图,每个象素占16bit即2个字节 这个替换程序怎样写啊??
大家帮帮忙!

解决方案 »

  1.   

    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, ComCtrls, StdCtrls, Menus, IniFiles;type
      TFStatus = (fsNoDraw, fsDrawed, fsAnalysed, fsCharFilled);
      TfrmMain = class(TForm)
        Panel1: TPanel;
        pnlMain: TPanel;
        pgcMain: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        btnDraw: TButton;
        imgMain: TImage;
        btnSetFont: TButton;
        edtChar: TEdit;
        edtMatrixNum: TEdit;
        btnAnalyse: TButton;
        mmoMain: TMemo;
        edtOut: TEdit;
        edtIn: TEdit;
        btnFill: TButton;
        pnlStatus: TPanel;
        pnlColor: TPanel;
        pmuMemo: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        procedure btnDrawClick(Sender: TObject);
        procedure btnSetFontClick(Sender: TObject);
        procedure btnAnalyseClick(Sender: TObject);
        procedure btnFillClick(Sender: TObject);
        procedure imgMainMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormShow(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        FSelfStatus: TFStatus;
        function RefreshButton: String;
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;const
      clFrame = clBlack;
      clOut = clRed;
      clIn = clBlue;
      clBrush = clWhite;
      clFont = clBlack;implementation{$R *.dfm}procedure TfrmMain.btnDrawClick(Sender: TObject);
    var
      sText: String;
    begin
      //
      imgMain.Canvas.Brush.Color := clBrush;
      imgMain.Canvas.Pen.Color := clFont;
      imgMain.Canvas.Font.Color := clFont;
      imgMain.Canvas.FillRect(imgMain.ClientRect);  //
      sText := Trim(edtChar.Text);
      imgMain.Canvas.TextOut(0, 0, sText);  //
      FSelfStatus := fsDrawed;
      RefreshButton;
    end;procedure TfrmMain.btnSetFontClick(Sender: TObject);
    begin
      with TFontDialog.Create(nil) do
      try
        Font.Assign(imgMain.Canvas.Font);
        if Execute then
          imgMain.Canvas.Font.Assign(Font);
      finally
        Free;
      end;  //
      RefreshButton;
    end;procedure TfrmMain.btnAnalyseClick(Sender: TObject);
    var
      i, j: Integer;
      iHiMatrixNum, iWiMatrixNum: Integer;
      iFontHeight, iHeightSpace: Integer;
      iFontWidth, iWidthSpace: Integer;
    begin
      //取高度和宽度
      iFontHeight := imgMain.Canvas.TextHeight(Trim(edtChar.Text));
      iFontWidth := imgMain.Canvas.TextWidth(Trim(edtChar.Text));  //画边框
      //for i := 0 to iFontWidth - 1 do
      //begin
      //  imgMain.Canvas.Pixels[i, 0] := clFrame;
      //  imgMain.Canvas.Pixels[i, iFontHeight - 1] := clFrame;
      //end;
      //for i := 0 to iFontHeight - 1 do
      //begin
      //  imgMain.Canvas.Pixels[0, i] := clFrame;
      //  imgMain.Canvas.Pixels[iFontWidth - 1, i] := clFrame;
      //end;  //分析间距
      iHiMatrixNum := StrToIntDef(edtMatrixNum.Text, 32);
      iWiMatrixNum := iHiMatrixNum * Length(Trim(edtChar.Text)) div 2;
      iHeightSpace := iFontHeight div iHiMatrixNum;
      iWidthSpace := iFontWidth div iWiMatrixNum;  //
      for i := 0 to iFontWidth - 1 do
      begin
        for j := 0 to iFontHeight - 1 do
        begin
          if (i mod iWidthSpace = 0) and (j mod iHeightSpace = 0) then
          begin
            if imgMain.Canvas.Pixels[i, j] = imgMain.Canvas.Font.Color then
              imgMain.Canvas.Pixels[i, j] := clIn
            else
              imgMain.Canvas.Pixels[i, j] := clOut;
          end;
        end;
      end;  //
      FSelfStatus := fsAnalysed;
      RefreshButton;
    end;procedure TfrmMain.btnFillClick(Sender: TObject);
    var
      i, j: Integer;
      iFontHeight: Integer;
      iFontWidth: Integer;
      sTemp: String;
    begin
      //取高度和宽度
      iFontHeight := imgMain.Canvas.TextHeight(Trim(edtChar.Text));
      iFontWidth := imgMain.Canvas.TextWidth(Trim(edtChar.Text));  //
      Screen.Cursor := crHourGlass;
      try
        mmoMain.Clear;
        for j := 0 to iFontHeight - 1 do
        begin
          sTemp := '';
          for i := 0 to iFontWidth - 1 do
          begin
            case imgMain.Canvas.Pixels[i, j] of
              clOut: sTemp := sTemp + edtOut.Text;
              clIn: sTemp := sTemp + edtIn.Text;
            end;
          end;
          if Trim(sTemp) <> '' then mmoMain.Lines.Add(sTemp);
        end;
      finally
        Screen.Cursor := crDefault;
      end;  //
      FSelfStatus := fsCharFilled;
      RefreshButton;
    end;procedure TfrmMain.imgMainMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      pnlColor.Color := (Sender as TImage).Canvas.Pixels[X, Y];
    end;procedure TfrmMain.FormShow(Sender: TObject);
    begin
      pgcMain.ActivePageIndex := 0;
      imgMain.Canvas.Font.Size := 400;
      RefreshButton;  //
      if FileExists(ChangeFileExt(Application.ExeName, '.ini')) then
      begin
        with TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')) do
        try
          //
          edtChar.Text := ReadString('CONT', 'CHAR', '岁月如梦');
          edtMatrixNum.Text := ReadString('CONT', 'MATRIX', '32');
          edtOut.Text := ReadString('CONT', 'OUT', '0');
          edtIn.Text := ReadString('CONT', 'IN', '1');      //
          imgMain.Canvas.Font.Name := ReadString('FONT', 'NAME', imgMain.Canvas.Font.Name);
          imgMain.Canvas.Font.Size := ReadInteger('FONT', 'SIZE', imgMain.Canvas.Font.Size);
        finally
          Free;
        end;
      end;
    end;function TfrmMain.RefreshButton: String;
    begin
      btnDraw.Enabled := True;
      btnSetFont.Enabled := True;
      btnAnalyse.Enabled := FSelfStatus = fsDrawed;
      btnFill.Enabled := FSelfStatus = fsAnalysed;  //
      case FSelfStatus of
        fsNoDraw, fsDrawed, fsAnalysed: pgcMain.ActivePageIndex := 0;
        fsCharFilled: pgcMain.ActivePageIndex := 1;
      end;end;procedure TfrmMain.N2Click(Sender: TObject);
    begin
      with TSaveDialog.Create(nil) do
      try
        InitialDir := ExtractFileDir(Application.ExeName);
        Filter := '文本文件|*.txt';
        FileName := Trim(edtChar.Text) + '-' + FormatDateTime('YYYYMMDDHHMMSS', Date + Time);
        if Execute then mmoMain.Lines.SaveToFile(ChangeFileExt(FileName, '.txt'));
      finally
        Free;
      end;
    end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        with TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')) do
        try
          //
          WriteString('CONT', 'CHAR', edtChar.Text);
          WriteString('CONT', 'MATRIX', edtMatrixNum.Text);
          WriteString('CONT', 'OUT', edtOut.Text);
          WriteString('CONT', 'IN', edtIn.Text);      //
          WriteString('FONT', 'NAME', imgMain.Canvas.Font.Name);
          WriteInteger('FONT', 'SIZE', imgMain.Canvas.Font.Size);
        finally
          Free;
        end;
    end;end.