曹 娜
一、需求分析
筆者從事國畫教學(xué)工作,但也是一個(gè)編程發(fā)燒友,在長期從事畫畫的創(chuàng)作中,利用信息化手段,將創(chuàng)造作品保存到計(jì)算機(jī)里,通過網(wǎng)絡(luò)可以和同行進(jìn)行交流,也可以將自己的作品公布到網(wǎng)站上,為教學(xué)研究開創(chuàng)了一條創(chuàng)新之路。但在通過網(wǎng)絡(luò)交流的時(shí)候遇到了一個(gè)很大的問題,用數(shù)碼相機(jī)或者掃描儀,獲取的圖片字節(jié)數(shù)太大,少則幾兆,多則幾十兆,給網(wǎng)絡(luò)傳輸和網(wǎng)站公布都帶來了不少的麻煩,通過PS能夠?qū)⑦@些大字節(jié)數(shù)的圖片文件處理為大小適中的圖片(以便使備份與同行相互遠(yuǎn)程傳輸也顯得比較容易)。但不能夠自動批量處理,而其有版權(quán)的問題,經(jīng)過半年的努力,筆者用C++開發(fā)了自動批量處理的圖片處理軟件。
軟件開發(fā)考慮到可應(yīng)用到其他領(lǐng)域,因此需考慮通用的因素,軟件進(jìn)入界面如圖1所示。
二、軟件功能
1.視頻瀏覽:如果當(dāng)前文件夾下有視頻文件,可以進(jìn)行瀏覽,只能播放mpeg格式,如果圖片文件列表第一個(gè)文件是視頻格式文件,就自動播放,如果要處理圖片文件,單擊“結(jié)束視頻”。
2.轉(zhuǎn)換圖片:單擊文件列表框文件,單擊“轉(zhuǎn)換設(shè)置”顯示當(dāng)前選準(zhǔn)圖片的像素高度和寬度,保持圖片縱橫比保持圖片不變形,輸入要轉(zhuǎn)換的像素?cái)?shù)據(jù),按照原圖片的縱橫比計(jì)算相對應(yīng)的像素,并加以顯示。選擇“轉(zhuǎn)換當(dāng)前圖片”,是指轉(zhuǎn)換當(dāng)前選準(zhǔn)的圖片,選擇“連續(xù)轉(zhuǎn)換”是指自動連續(xù)轉(zhuǎn)換左邊文件列表框內(nèi)的所有圖片文件,按照統(tǒng)一像素尺寸、同一格式進(jìn)行轉(zhuǎn)換,這種情況適用于圖片大小格式一樣的一組照片;“轉(zhuǎn)換文件另存”是指轉(zhuǎn)換成的目標(biāo)文件另存為,原文件名_1.jpg,
“覆蓋原文件”是指轉(zhuǎn)換動作完成生成的文件名就是選準(zhǔn)的文件名,將原文件名覆蓋,這種覆蓋無法恢復(fù)。
3.可用于教師編寫專業(yè)教材時(shí),對教材插圖的處理,利用單個(gè)圖片文件的處理。
三、代碼實(shí)現(xiàn)
單擊“執(zhí)行”(Button7)事件函數(shù)
void__fastcall TForm1::Button7Click(TObject *Sender)
{
Form1->Button8->Enabled=false;
Form1->Panel6->Visible=false;
if(Form1->RadioButton1->Checked==true)//轉(zhuǎn)換當(dāng)前圖片
{
ppc=ppc.LowerCase();
int k=ppc.Pos(".jpg");
int k1=ppc.Pos(".jpeg");
int j=ppc.Pos(".bmp");
if(j>0 || k>0 || k1>0)
{
WRJPG(ppc);//-----轉(zhuǎn)換函數(shù)
Application->MessageBox("圖片大小轉(zhuǎn)換成功","信息",48);
Form1->FileListBox1->Update();
}
else
{
String kdv="";
kdv=kdv+ppc+"不是圖片文件,所以無法轉(zhuǎn)換";
Application->MessageBox(kdv.c_str(),"信息",48);
}
}
if(Form1->RadioButton2->Checked==true)//連續(xù)轉(zhuǎn)換
{
int mk=Form1->FileListBox1->Items->Count;//獲取圖片文件列表總數(shù)
int ndkf=0;
Form1->ProgressBar1->Min=0;
Form1->ProgressBar1->Max=mk;
Form1->ProgressBar1->Visible=true;
for(int i=0;i<mk;i++)//---執(zhí)行連續(xù)轉(zhuǎn)換循環(huán)
{
Form1->ProgressBar1->Position=i;
Application->ProcessMessages();
ppc=Form1->FileListBox1->Items->Strings[i];
ppc=ppc.LowerCase();
int k=ppc.Pos(".jpg");
int k1=ppc.Pos(".jpeg");
int j=ppc.Pos(".bmp");
if(j>0 || k>0 || k1>0)
{
try {
Form1->Image1->Picture->LoadFromFile(ppc);
ndkf=ndkf+1;
WRJPG(ppc);//--核心轉(zhuǎn)換函數(shù)
}
catch(...){}
}
}
Form1->ProgressBar1->Position=mk;
Form1->ProgressBar1->Visible=false;
Form1->FileListBox1->Update();
String dkc="";
dkc=dkc+"共有"+IntToStr(ndkf).c_str()+"個(gè)圖片文件進(jìn)行成功轉(zhuǎn)換"; ;
Application->MessageBox(dkc.c_str(),"信息",48);
}
Form1->Button8->Enabled=true;
}
核心轉(zhuǎn)換函數(shù)WRJPG();
void __fastcall TForm1::WRJPG(AnsiString filename)
{
if(p<=0 || q<=0) return ;//轉(zhuǎn)換像素的寬度和高度
if(p>0 && q>0)
{
Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap();//動態(tài)生成位圖類
Graphics::TBitmap *tmpBitmap2 = new Graphics::TBitmap();//動態(tài)生成位圖類
TJPEGImage*tmpBitmap1 = new TJPEGImage();//動態(tài)生成JPG類
filename=filename.LowerCase();
int lq=filename.Pos(".bmp");
int lp=filename.Pos(".jpg");
int lp1=filename.Pos(".jpeg");
if(lp>0 || lp1>0) {
tmpBitmap1->LoadFromFile(filename);//將位圖裝載到生成的位圖類tmpBitmap1
tmpBitmap->Assign(tmpBitmap1);//將位圖類轉(zhuǎn)換為jpg類
}
if(lq>0)
tmpBitmap->LoadFromFile(filename);
tmpBitmap2->W(wǎng)idth=q;
tmpBitmap2->Height=p;
tmpBitmap2->Canvas->StretchDraw(Rect
(0,0,tmpBitmap2->W(wǎng)idth,tmpBitmap2->Height),tmpBitmap);//將轉(zhuǎn)換目標(biāo)像素畫布
TJPEGImage *jp = new TJPEGImage();
try
{
//將位圖文件寫入TJPEGImage 類
jp->Assign(tmpBitmap2);
jp->CompressionQuality = 85;//指的是轉(zhuǎn)換質(zhì)量,100為最高質(zhì)量,加上這句就可以了
jp->Compress();//執(zhí)行寫入
AnsiString jpc,jpd;
//int l0=filename.Length();
int l1=filename.Pos(".");
if(l1>0)//有擴(kuò)展名
{
jpc=filename.SubString(1,l1-1);
if(Form1->RadioButton4->Checked==true)//覆蓋原圖片文件
{
if(lp1>0)
jpc=jpc+".jpeg";
else
jpc=jpc+".jpg";
}
if(Form1->RadioButton3->Checked==true)//另存為文件
{
if(lp1>0)
jpc=jpc+"_1.jpeg";
else
jpc=jpc+"_1.jpg";//原文件名+“_1.jpg”
}
}
if(l1<=0)//沒有擴(kuò)展名
{
jpc=filename;
if(Form1->RadioButton4->Checked==true)
{
if(lp1>0)
jpc=jpc+".jpeg";
else
jpc=jpc+".jpg";
}
if(Form1->RadioButton3->Checked==true)
{
if(lp1>0)
jpc=jpc+"_1.jpeg";
else
jpc=jpc+"_1.jpg";
}
}
//Application->MessageBox(jpc.c_str(),filename.c_str(),48);
jp->SaveToFile(jpc);//將jpg類保存為jpc文件
}
__finally
{
delete jp;//刪除jp類
}
delete tmpBitmap;
delete tmpBitmap1;
delete tmpBitmap2;
}//p>0 && q>0
}