曹 娜
一、需求分析
笔者从事国画教学工作,但也是一个编程发烧友,在长期从事画画的创作中,利用信息化手段,将创造作品保存到计算机里,通过网络可以和同行进行交流,也可以将自己的作品公布到网站上,为教学研究开创了一条创新之路。但在通过网络交流的时候遇到了一个很大的问题,用数码相机或者扫描仪,获取的图片字节数太大,少则几兆,多则几十兆,给网络传输和网站公布都带来了不少的麻烦,通过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
}