⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cpp

📁 C++Builder程序员编程手记《配书光盘》
💻 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 + -