📄 mainform.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct rgb_str{
unsigned char r_color;
unsigned char g_color;
unsigned char b_color;};
DynamicArray< DynamicArray <rgb_str> > rgb;
Graphics::TBitmap *bitmap;
int i,j,width,height;
bool scumble=false;
TColor StartColor,EndColor;
TPoint Origin,MovePt;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OpenButtonClick(TObject *Sender)
{
TColor color;
scumble=false;
if(OpenPictureDialog1->Execute()){
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
width=Image1->Picture->Width;
height=Image1->Picture->Height;
rgb.Length=width;
for(i=0;i<rgb.Length;i++)
rgb[i].Length=height;
for(i=0;i<width-1;i++)
for(j=0;j<height-1;j++){
color=Image1->Canvas->Pixels[i][j];
rgb[i][j].r_color=GetRValue(color);
rgb[i][j].g_color=GetGValue(color);
rgb[i][j].b_color=GetBValue(color);
}
bitmap=new Graphics::TBitmap;
bitmap->Width=width;
bitmap->Height=height;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CloseButtonClick(TObject *Sender)
{
scumble=false;
Image1->Picture=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SoftBitBtnClick(TObject *Sender)
{
int red,green,blue;
scumble=false;
for(i=1;i<width-2;i++)
for(j=1;j<height-2;j++){
red=rgb[i-1][j-1].r_color+rgb[i][j-1].r_color+rgb[i+1][j-1].r_color+
rgb[i-1][j].r_color+rgb[i][j].r_color+rgb[i+1][j].r_color+
rgb[i-1][j+1].r_color+rgb[i][j+1].r_color+rgb[i+1][j+1].r_color;
green=rgb[i-1][j-1].g_color+rgb[i][j-1].g_color+rgb[i+1][j-1].g_color+
rgb[i-1][j].g_color+rgb[i][j].g_color+rgb[i+1][j].g_color+
rgb[i-1][j+1].g_color+rgb[i][j+1].g_color+rgb[i+1][j+1].g_color;
blue=rgb[i-1][j-1].b_color+rgb[i][j-1].b_color+rgb[i+1][j-1].b_color+
rgb[i-1][j].b_color+rgb[i][j].b_color+rgb[i+1][j].b_color+
rgb[i-1][j+1].b_color+rgb[i][j+1].b_color+rgb[i+1][j+1].b_color;
bitmap->Canvas->Pixels[i][j]=(TColor)RGB(red/9,green/9,blue/9);
}
Image1->Picture->Bitmap->Assign(bitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SharpBitBtnClick(TObject *Sender)
{
float degree=0.5;
int red,green,blue;
scumble=false;
for(i=1;i<width-1;i++)
for(j=1;j<height-1;j++){
red=rgb[i][j].r_color+degree*(rgb[i][j].r_color-rgb[i-1][j-1].r_color);
green=rgb[i][j].g_color+degree*(rgb[i][j].g_color-rgb[i-1][j-1].g_color);
blue=rgb[i][j].b_color+degree*(rgb[i][j].b_color-rgb[i-1][j-1].b_color);
red=min(255,max(0,red));
green=min(255,max(0,green));
blue=min(255,max(0,blue));
bitmap->Canvas->Pixels[i][j]=(TColor)RGB(red,green,blue);
}
Image1->Picture->Bitmap->Assign(bitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FloatBitBtnClick(TObject *Sender)
{
int red,green,blue;
const int const_value=128;
scumble=false;
for(i=0;i<width-2;i++)
for(j=0;j<height-2;j++){
red=abs(rgb[i][j].r_color-rgb[i+1][j+1].r_color+const_value);
green=abs(rgb[i][j].g_color-rgb[i+1][j+1].g_color+const_value);
blue=abs(rgb[i][j].b_color-rgb[i+1][j+1].b_color+const_value);
bitmap->Canvas->Pixels[i][j]=(TColor)RGB(red,green,blue);
}
Image1->Picture->Bitmap->Assign(bitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RotateBitBtnClick(TObject *Sender)
{
Graphics::TBitmap *TempBitmap;
DynamicArray< DynamicArray<rgb_str> > Rrgb;
scumble=false;
TempBitmap=new Graphics::TBitmap;
TempBitmap->Width=height;
TempBitmap->Height=width;
Rrgb.Length=height;
for(i=0;i<height;i++)
Rrgb[i].Length=width;
for(i=0;i<height-1;i++)
for(j=0;j<width-1;j++){
Rrgb[i][j]=rgb[width-1-j][i];
TempBitmap->Canvas->Pixels[i][j]=(TColor)RGB(Rrgb[i][j].r_color,Rrgb[i][j].g_color,Rrgb[i][j].b_color);
}
height=TempBitmap->Height;
width=TempBitmap->Width;
rgb=Rrgb;
Image1->Picture->Bitmap->Assign(TempBitmap);
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::inverseBitBtnClick(TObject *Sender)
{
int red,green,blue;
scumble=false;
for(i=0;i<width-1;i++)
for(j=0;j<height;j++)
{
red=rgb[i][j].r_color=255-rgb[i][j].r_color;
green=rgb[i][j].g_color=255-rgb[i][j].g_color;
blue=rgb[i][j].b_color=255-rgb[i][j].b_color;
bitmap->Canvas->Pixels[i][j]=(TColor)RGB(red,green,blue);
}
Image1->Picture->Bitmap->Assign(bitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExpandBitBtnClick(TObject *Sender)
{
int x,red,green,blue;
randomize();
for(i=0;i<width-1;i++)
for(j=0;j<height-1;j++)
{
x=random(2);
red=rgb[i+x][j+x].r_color;
green=rgb[i+x][j+x].g_color;
blue=rgb[i+x][j+x].b_color;
bitmap->Canvas->Pixels[i][j]=(TColor)RGB(red,green,blue);
}
Image1->Picture->Assign(bitmap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(scumble)
{
Image1->Cursor=crCross;
Image1->Canvas->MoveTo(X,Y);
Origin=Point(X,Y);
MovePt=Point(X,Y);
StartColor=Image1->Canvas->Pixels[X][Y];
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(scumble&&Shift.Contains(ssLeft))
{
Image1->Canvas->Pen->Mode=pmNotXor;
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->LineTo(MovePt.x,MovePt.y);
Image1->Canvas->MoveTo(Origin.x,Origin.y);
Image1->Canvas->LineTo(X,Y);
MovePt=Point(X,Y);
Image1->Canvas->Pen->Mode=pmCopy;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int StartRed,StartGreen,StartBlue,EndRed,EndGreen,EndBlue;
float RedStep,GreenStep,BlueStep;
if(scumble&&width!=0)
{
EndColor=Image1->Canvas->Pixels[X][Y];
StartRed=GetRValue(StartColor);
StartGreen=GetGValue(StartColor);
StartBlue=GetBValue(StartColor);
EndRed=GetRValue(EndColor);
EndGreen=GetGValue(EndColor);
EndBlue=GetBValue(EndColor);
RedStep=(float)(EndRed-StartRed)/width;
GreenStep=(float)(EndGreen-StartGreen)/width;
BlueStep=(float)(EndBlue-StartBlue)/width;
for(i=0;i<width-1;i++)
for(j=0;j<height-1;j++)
{
bitmap->Canvas->Pen->Color=(TColor)RGB(StartRed+int(RedStep*i),
StartGreen+int(GreenStep*i),
StartBlue+int(BlueStep*i));
bitmap->Canvas->MoveTo(i,0);
bitmap->Canvas->LineTo(i,height);
}
Image1->Picture->Assign(bitmap);
Invalidate();
Image1->Cursor=crDefault;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ColorBitBtnClick(TObject *Sender)
{
scumble=true;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -