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

📄 unit1.~cpp

📁 基本的图像处理功能
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    m_Flag=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    mp_Bmp=new Graphics::TBitmap();
    //mp_Bmp是位图指针,它指向一个bmp图片;该句是给该位图指针分配动态内存
    if(!(OpenPictureDialog1->Execute()))
        return;
    mp_Bmp->LoadFromFile(OpenPictureDialog1->FileName);
    //mp_Bmp从OpenPictureDialog1的路径中读入图片;
    Image1->Picture->Bitmap=mp_Bmp;
    //Image1显示图片;

    m_W=mp_Bmp->Width;
    m_H=mp_Bmp->Height;
    mp_Data=new BYTE[m_W*m_H];
    //用mp_Data用来存储mp_Bmp中图片的像素值
    if(mp_Bmp->PixelFormat==pf24bit)
    //如果mp_Bmp中的图片格式是24位的
        for(int y=0;y<m_H;y++)
            {
            mp_Str=(Byte *)(mp_Bmp->ScanLine[y]);
            //让mp_Str指向mp_Bmp中图片第y行的首地址
            for(int x=0;x<m_W;x++)
                {
                mp_Data[y*m_W+x]=(mp_Str[3*x]+mp_Str[3*x+1]+mp_Str[3*x+2])/3;
                }
            }
        m_Flag=true;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
/*
    for(int y=0;y<m_H;y++)
            {
            mp_Str=(Byte *)(mp_Bmp->ScanLine[y]);
            //让mp_Str指向mp_Bmp中图片第y行的首地址
            for(int x=0;x<m_W;x++)
                {
                //mp_Data[y*m_W+x]=(mp_Str[3*x]+mp_Str[3*x+1]+mp_Str[3*x+2])/3;
                mp_Str[3*x]=mp_Data[y*m_W+x];
                mp_Str[3*x+1]=mp_Data[y*m_W+x];
                mp_Str[3*x+2]=mp_Data[y*m_W+x];
                }
            }
*/
    PutDataIntoBmp24(mp_Data,mp_Bmp,mp_Str,m_W,m_H);
//    Image1->Picture->Bitmap=mp_Bmp;
//    Image1->Picture->Bitmap->SaveToFile("f:\\灰度图.bmp");
//    mp_Bmp->SaveToFile("f:\\灰度图.bmp");
    Produce_Save(Image1,mp_Bmp,OpenPictureDialog1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    int mC;
/*
    if(Edit1->Text=="")
        {
        MessageBox(NULL,"没输入临界值","出错",MB_OK);
        return;
        }
*/
//    mC=StrToInt(Edit1->Text);

    mC=TrackBar1->Position;

    for(int y=0;y<m_H;y++)
        for(int x=0;x<m_W;x++)
            {
            if(mp_Data[y*m_W+x]>mC)
                mp_Data[y*m_W+x]=255;
            if(mp_Data[y*m_W+x]<=mC)
                mp_Data[y*m_W+x]=0;
            }

/*
    for(int y=0;y<m_H;y++)
            {
            mp_Str=(Byte *)(mp_Bmp->ScanLine[y]);
            for(int x=0;x<m_W;x++)
                {
                //mp_Data[y*m_W+x]=(mp_Str[3*x]+mp_Str[3*x+1]+mp_Str[3*x+2])/3;
                mp_Str[3*x]=mp_Data[y*m_W+x];
                mp_Str[3*x+1]=mp_Data[y*m_W+x];
                mp_Str[3*x+2]=mp_Data[y*m_W+x];
                }
            }
*/
    PutDataIntoBmp24(mp_Data,mp_Bmp,mp_Str,m_W,m_H);
/*
    Image1->Picture->Bitmap=mp_Bmp;
    mp_Bmp->SaveToFile("f:\\二值图.bmp");
*/
    Produce_Save(Image1,mp_Bmp,OpenPictureDialog1);
}
//---------------------------------------------------------------------------


bool TForm1::PutDataIntoBmp24(Byte * mpData, Graphics::TBitmap *mpBmp,BYTE *mpStr,int mW, int mH)
{
    for(int y=0;y<mH;y++)
            {
            mpStr=(Byte *)(mpBmp->ScanLine[y]);
            for(int x=0;x<mW;x++)
                {
                mpStr[3*x]=mpData[y*mW+x];
                mpStr[3*x+1]=mpData[y*mW+x];
                mpStr[3*x+2]=mpData[y*mW+x];
                }
            }
    return true;           //TODO: Add your source code here
}

bool TForm1::Produce_Save(TImage *Image,Graphics::TBitmap *mpBmp,TOpenPictureDialog *OpenPictureDialog1)
{
    Image1->Picture->Bitmap=mpBmp;
    mpBmp->SaveToFile(OpenPictureDialog1->FileName+"已处理");
    return true;
    //TODO: Add your source code here
}
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
    BYTE *mpData=new BYTE[m_W*m_H];

/*
    if(Edit1->Text=="")
        {
        MessageBox(NULL,"没输入临界值","出错",MB_OK);
        return;
        }
*/
//    mC=StrToInt(Edit1->Text);

    mC=TrackBar1->Position;
    Edit1->Text=IntToStr(mC);
    for(int y=0;y<m_H;y++)
        for(int x=0;x<m_W;x++)
            {
            if(mp_Data[y*m_W+x]>mC)
                mpData[y*m_W+x]=255;
            if(mp_Data[y*m_W+x]<=mC)
                mpData[y*m_W+x]=0;
            }

/*
    for(int y=0;y<m_H;y++)
            {
            mp_Str=(Byte *)(mp_Bmp->ScanLine[y]);
            for(int x=0;x<m_W;x++)
                {
                //mp_Data[y*m_W+x]=(mp_Str[3*x]+mp_Str[3*x+1]+mp_Str[3*x+2])/3;
                mp_Str[3*x]=mp_Data[y*m_W+x];
                mp_Str[3*x+1]=mp_Data[y*m_W+x];
                mp_Str[3*x+2]=mp_Data[y*m_W+x];
                }
            }
*/

    PutDataIntoBmp24(mpData,mp_Bmp,mp_Str,m_W,m_H);

    Image1->Picture->Bitmap=mp_Bmp;
//    mp_Bmp->SaveToFile("f:\\二值图.bmp");

//    Produce_Save(Image1,mp_Bmp,SavePictureDialog1);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    if(m_Flag==true)
        Label1->Caption=IntToStr(mp_Data[Y*m_W+X]);
    else
        return;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -