#include <vcl.h>
#pragma hdrstop
#include <JPEG.hpp>
#include "Unit1.h"
#include <math.h>
#define max(a,b)((a>b)?a:b)
#define min(a,b)((a<b)?a:b)
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
inline TForm1::btnRefreshPicClick(TObject *Sender)
{
Graphics::TBitmap *ptr_bmp;
ptr_bmp=new Graphics::TBitmap();
ptr_bmp->Width=image2->Width;
ptr_bmp->Height=image2->Height;
image1->Canvas->Draw(0,0,ptr_bmp);
image2->Canvas->Draw(0,0,ptr_bmp);
delete ptr_bmp;
}
//---------------------------------------------------------------------------
inline TForm1::btnLoadPicClick(TObject *Sender)
{
OpenPictureDialog1->Execute();
image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
image1->AutoSize=true;
}
//---------------------------------------------------------------------------
inline TForm1::btnRotatePicClick(TObject *Sender)
{
if (image1->Picture->Bitmap->Empty==true)
ShowMessage("請載入圖檔!!");
int angle=StrToInt(angel->Text);
Graphics::TBitmap *Bitmap1=new Graphics::TBitmap;
Graphics::TBitmap *Bitmap2=new Graphics::TBitmap;
Bitmap1->Assign(image1->Picture->Bitmap);
float radians=(2*3.1415926*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(-Bitmap1->Height*sine);
float Point1y=(Bitmap1->Height*cosine);
float Point2x=(Bitmap1->Width*cosine-Bitmap1->Height*sine);
float Point2y=(Bitmap1->Height*cosine+Bitmap1->Width*sine);
float Point3x=(Bitmap1->Width*cosine);
float Point3y=(Bitmap1->Width*sine);
float minx=min(0.1,min(Point1x,min(Point2x,Point3x)));
float miny=min(0.1,min(Point1y,min(Point2y,Point3y)));
float maxx=max(0.1,max(Point1x,max(Point2x,Point3x)));
float maxy=max(0.1,max(Point1y,max(Point2y,Point3y)));
int Bitmap2Width=(int)ceil(maxx-minx);
int Bitmap2Height=(int)ceil(maxy-miny);
Bitmap2->Height=Bitmap2Height;
Bitmap2->Width=Bitmap2Width;
Bitmap2->Canvas->Brush->Color=TColor(RGB(255,255,255));
Bitmap2->Canvas->FillRect(Rect(0, 0, image1->Width, image1->Height));
for(int x=0;x<Bitmap2Width;x++)
{
for(int y=0;y<Bitmap2Height;y++)
{
int Bitmap1x=(int)((x+minx)*cosine+(y+miny)*sine);
int Bitmap1y=(int)((y+miny)*cosine-(x+minx)*sine);
if(Bitmap1x>=0&&Bitmap1x<Bitmap1->Width&&Bitmap1y>=0&&Bitmap1y<Bitmap1->Height)
{
Bitmap2->Canvas->Pixels[x][y]=Bitmap1->Canvas->Pixels[Bitmap1x][Bitmap1y];
}
}
}
image2->Picture->Bitmap=Bitmap2;
delete Bitmap2;
delete Bitmap1;
}
//---------------------------------------------------------------------------
inline TForm1::btnGrayClick(TObject *Sender)
{
if (image1->Picture->Bitmap->Empty==true)
ShowMessage("請載入圖檔!!");
Graphics::TBitmap *Bmp = new Graphics::TBitmap();
Byte *ptr;
int r,g,b;
int gray;
int i,j;
Bmp->Assign(image1->Picture->Bitmap);
for(j=0;j<Bmp->Height;j++)
{
ptr = (Byte *)Bmp->ScanLine[j];
for(i=0;i<Bmp->Width;i++)
{
b=ptr[i*3];
g=ptr[i*3+1];
r=ptr[i*3+2];
gray= (r + g + b)/3;
ptr[i*3]=(Byte)gray;
ptr[i*3+1]=(Byte)gray;
ptr[i*3+2]=(Byte)gray;
}
}
image2->Picture->Assign(Bmp);
}
//---------------------------------------------------------------------------
inline TForm1::btnSavePicClick(TObject *Sender)
{
if (image1->Picture->Bitmap->Empty==true)
ShowMessage("請載入圖檔!!");
SavePictureDialog1->Execute();
image2->Picture->SaveToFile(SavePictureDialog1->FileName);
}