一张有文字的单色图片
文字是一种颜色,背景图片是一种颜色,
现在想将原来的每个象素显示文字的部分用1表示,显示图片的部分用0表示
0000000000000000
0000100000000000
0000100000000000
0000100000000000类似这样
原来的图片是16位图,每个象素占16bit即2个字节 这个替换程序怎样写啊??
大家帮帮忙!
文字是一种颜色,背景图片是一种颜色,
现在想将原来的每个象素显示文字的部分用1表示,显示图片的部分用0表示
0000000000000000
0000100000000000
0000100000000000
0000100000000000类似这样
原来的图片是16位图,每个象素占16bit即2个字节 这个替换程序怎样写啊??
大家帮帮忙!
解决方案 »
- 一个delphi的基础问题
- 这个软件能要多少钱??
- 怎样在程序中给ADOQuery加多个参数?
- 谁能简单介绍一下delphi7?如:有什么新特性。。等。谢谢
- 今天到招聘会现场,要VC的到很多,都对Delphi表现出不削,为什么,难道Delphi错了吗??
- 定义自己的组件编辑器,TComponentEditor的哪些方法必须覆盖?回答全面一些,举例不给分
- 一个单线程可以同时用吗?
- 十进制转换二进制问题,急急
- 如何用对话框选择指定目录?急!!!!!!!!!!!!!!!!!!!!!!!
- 该怎么办,编译时出现错误[Fatal Error] Project2.dpr(1): File not found: 'System.pas'
- 有在東莞城區附近樂意兼職Delphi的嗎?
- 介绍一个JAVA#JSP群,同时问一个关于如何访问网络数据库的问题,放分!
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.