用C++开发图片批量处理软件

2009-07-24 08:51
中国教育信息化·高教职教 2009年6期
关键词:文件名批量像素

曹 娜

一、需求分析

笔者从事国画教学工作,但也是一个编程发烧友,在长期从事画画的创作中,利用信息化手段,将创造作品保存到计算机里,通过网络可以和同行进行交流,也可以将自己的作品公布到网站上,为教学研究开创了一条创新之路。但在通过网络交流的时候遇到了一个很大的问题,用数码相机或者扫描仪,获取的图片字节数太大,少则几兆,多则几十兆,给网络传输和网站公布都带来了不少的麻烦,通过PS能够将这些大字节数的图片文件处理为大小适中的图片(以便使备份与同行相互远程传输也显得比较容易)。但不能够自动批量处理,而其有版权的问题,经过半年的努力,笔者用C++开发了自动批量处理的图片处理软件。

软件开发考虑到可应用到其他领域,因此需考虑通用的因素,软件进入界面如图1所示。

二、软件功能

1.视频浏览:如果当前文件夹下有视频文件,可以进行浏览,只能播放mpeg格式,如果图片文件列表第一个文件是视频格式文件,就自动播放,如果要处理图片文件,单击“结束视频”。

2.转换图片:单击文件列表框文件,单击“转换设置”显示当前选准图片的像素高度和宽度,保持图片纵横比保持图片不变形,输入要转换的像素数据,按照原图片的纵横比计算相对应的像素,并加以显示。选择“转换当前图片”,是指转换当前选准的图片,选择“连续转换”是指自动连续转换左边文件列表框内的所有图片文件,按照统一像素尺寸、同一格式进行转换,这种情况适用于图片大小格式一样的一组照片;“转换文件另存”是指转换成的目标文件另存为,原文件名_1.jpg,

“覆盖原文件”是指转换动作完成生成的文件名就是选准的文件名,将原文件名覆盖,这种覆盖无法恢复。

3.可用于教师编写专业教材时,对教材插图的处理,利用单个图片文件的处理。

三、代码实现

单击“执行”(Button7)事件函数

void__fastcall TForm1::Button7Click(TObject *Sender)

{

Form1->Button8->Enabled=false;

Form1->Panel6->Visible=false;

if(Form1->RadioButton1->Checked==true)//转换当前图片

{

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);//-----转换函数

Application->MessageBox("图片大小转换成功","信息",48);

Form1->FileListBox1->Update();

}

else

{

String kdv="";

kdv=kdv+ppc+"不是图片文件,所以无法转换";

Application->MessageBox(kdv.c_str(),"信息",48);

}

}

if(Form1->RadioButton2->Checked==true)//连续转换

{

int mk=Form1->FileListBox1->Items->Count;//获取图片文件列表总数

int ndkf=0;

Form1->ProgressBar1->Min=0;

Form1->ProgressBar1->Max=mk;

Form1->ProgressBar1->Visible=true;

for(int i=0;i<mk;i++)//---执行连续转换循环

{

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);//--核心转换函数

}

catch(...){}

}

}

Form1->ProgressBar1->Position=mk;

Form1->ProgressBar1->Visible=false;

Form1->FileListBox1->Update();

String dkc="";

dkc=dkc+"共有"+IntToStr(ndkf).c_str()+"个图片文件进行成功转换"; ;

Application->MessageBox(dkc.c_str(),"信息",48);

}

Form1->Button8->Enabled=true;

}

核心转换函数WRJPG();

void __fastcall TForm1::WRJPG(AnsiString filename)

{

if(p<=0 || q<=0) return ;//转换像素的宽度和高度

if(p>0 && q>0)

{

Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap();//动态生成位图类

Graphics::TBitmap *tmpBitmap2 = new Graphics::TBitmap();//动态生成位图类

TJPEGImage*tmpBitmap1 = new TJPEGImage();//动态生成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);//将位图类转换为jpg类

}

if(lq>0)

tmpBitmap->LoadFromFile(filename);

tmpBitmap2->Width=q;

tmpBitmap2->Height=p;

tmpBitmap2->Canvas->StretchDraw(Rect

(0,0,tmpBitmap2->Width,tmpBitmap2->Height),tmpBitmap);//将转换目标像素画布

TJPEGImage *jp = new TJPEGImage();

try

{

//将位图文件写入TJPEGImage 类

jp->Assign(tmpBitmap2);

jp->CompressionQuality = 85;//指的是转换质量,100为最高质量,加上这句就可以了

jp->Compress();//执行写入

AnsiString jpc,jpd;

//int l0=filename.Length();

int l1=filename.Pos(".");

if(l1>0)//有扩展名

{

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)//没有扩展名

{

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

}

猜你喜欢
文件名批量像素
赵运哲作品
文件名批量管理方法浅析
像素前线之“幻影”2000
浅议高校网银批量代发
基于AUTOIT3和VBA的POWERPOINT操作题自动批量批改
考虑价差和再制造率的制造/再制造混合系统生产批量研究
基于VC++6.0的文件名批量转换