.cpp
#include "saveFile.h"
void GetImageParament(QImage *pImg,struct IMAGEPARAMENT *ppImgParam)
{
if (pImg->isNull()) return;
ppImgParam->nWidth = pImg->width();
ppImgParam->nHeight = pImg->height();
ppImgParam->nBitCount = pImg->bitPlaneCount();
// ppImgParam->nBytesPerLine = pImg->bytesPerLine();
ppImgParam->nBytesPerLine = (pImg->width()*ppImgParam->nBitCount+31)/32*4;
ppImgParam->nBytesPerPixel = ppImgParam->nBitCount/8;
if (ppImgParam->nBitCount<=8)
ppImgParam->nNumColors= 1 << ppImgParam->nBitCount;
else
ppImgParam->nNumColors= 0;
ppImgParam->nSize = ppImgParam->nBytesPerLine*ppImgParam->nHeight;
}
int InImage(QImage *pImg,int x,int y)
{
struct IMAGEPARAMENT P;
GetImageParament(pImg,&P);
if ((x<0)||(y<0)||(x>=P.nWidth)||(y>=P.nHeight)) return 0;
else return 1;
}
//
//
void SetRectValue(QImage *pImg,int x,int y,int Dx,int Dy,unsigned char *buf)
{
struct IMAGEPARAMENT P;
char *lp;
int i,dw,dh,x1,y1,alpha,delta,Dxb,dwb;
GetImageParament(pImg,&P);
if (P.nBitCount<8) return;
x1=x;
y1=y;
alpha=delta=0;
if (x<0) {
alpha=-x; x1=0;
}
if (y<0) {
delta=-y; y1=0;
}
if (!InImage(pImg,x1,y1)) return;
if(Dx >(int) P.nWidth-x1)
{
dw =(int) P.nWidth-x1;
}
else
{
dw = Dx;
}
//dw=min(Dx,(int) P.nWidth-x1);
//dh=min(Dy,(int) P.nHeight-y1);
if(Dy >(int) P.nHeight-x1)
{
dh =(int) P.nHeight-x1;
}
else
{
dh = Dy;
}
dw -= alpha;
dh -= delta;
Dxb = Dx*P.nBytesPerPixel;
dwb = dw*P.nBytesPerPixel;
lp = (char*) ( pImg->constScanLine(x1)+y1*P.nBytesPerPixel);
buf += (delta*Dx+alpha)*P.nBytesPerPixel;
for (i=0;i verRgb)
{
struct IMAGEPARAMENT P;
pImg->convertToFormat(pSrcIma->format(), pSrcIma->colorTable() );
}
void ReSizeImage(QImage *imaDes, QImage *imaSource, double alpha)
{
struct IMAGEPARAMENT P;
RGBQUAD ColorTab[256];
int i, j, nSize;
unsigned char **list,*sc;
int Dx, Dy, x1, y1, x2, y2, flag, bpd;
double p, q/*, a, b, c, d, t1, t2, t3*/;
//if (ImageType(Imgm) == 2) //flag作为标志,当为1时,表示用双线性内插
// flag = 1;
//else
flag = 0; //为0时,表示用最近邻点法
GetImageParament(imaSource, &P);
Dx = (int) (alpha * imaSource->width());//计算结果位图宽度
Dy = (int) (alpha * imaSource->height());//计算结果位图高度
// imaDes -> destroy();
//imaDes ->create(Dx, Dy, P.nBitCount ); //建立结果位图
bpd = P.nBytesPerPixel;
//QVector verRgb;
//if (bpd == 1) //256色图像
//{
// for (i = 0; i < P.nNumColors; i++)
// {
// //GetAllPalette(imaSource, verRgb);
// // verRgb = imaSource->
// SetAllPalette(imaSource,imaDes, verRgb); //复制调色板
// }
//}
nSize = (Dx * P.nBitCount + 31) / 32 * 4; //(int) ((P.nBytesPerLine + P.nHeight * bpd) * alpha);//计算工作单元大小
//
sc = (unsigned char*) malloc(nSize); //申请像素行工作单元
list = (unsigned char**) malloc(P.nHeight * sizeof(unsigned char*)); //malloc(Dy * sizeof(BYTE*)); // 申请指针数组
//
//
for (i = 0; i < P.nHeight; i++)
{ ; // ->GetPixelAddress(0, 0) - i * P.nBytesPerLine;//生成二维数组
list[i] = (unsigned char*) (imaSource->constScanLine(i) );
}
//
for (j = 0; j < Dy; j++)
{
q = j / alpha;
y1 = (int) q;
y2 = y1 + 1;
q = q - y1;
for (i = 0;i < Dx; i++)
{
p = i / alpha;
x1 = (int) p; //x1,y1为整数部分
x2 = x1 + 1;
p = p - x1; //p,q为小数部分
if ((x2 > P.nWidth)||(y2 > P.nHeight )) // 范围检查
continue;
if (x2 == P.nWidth ) x2--;
if (y2 == P.nHeight ) y2--;
if (flag == 0) //flag等于0,采用最近邻点法
{
if (q > 0.5) y1 = y2;
if (p > 0.5) x1 = x2;
//char ch = (imaSource->pixelIndex(y1,x1*bpd));
memcpy(&sc[i * bpd], &list[y1][x1 * bpd],bpd); //从源位图复制像素数据
}
}
SetRectValue(imaDes, 0, j, Dx, 1, sc); //处理结果总结果位图
}
free(sc); //释放工作单元
free(list);
}
/****************************************************************************
函数名称:SavePictureToFile
函数功能:保存头像(只有源头像的一半)
输入参数:LPCTSTR pszSourceFileName :源图像,
LPCTSTR pszDesFileName:目标图像
输出参数:int
0:表示成功,
-1:表示源图像不存在,
-2:表示保存失败
作者: 管砥群
备注:
****************************************************************************/
int SavePictureToFile( QString pszSourceFileName , QString pszDesFileName )
{
QImage imageSource;
//载入源图像
if( true == imageSource.load(pszSourceFileName))
{
QImage imageDes;
imageDes = imageSource.scaled(imageSource.width()/2, imageSource.height()/2,Qt::KeepAspectRatio);
ReSizeImage(&imageDes,&imageSource,0.5);
if(0 == imageDes.save(pszDesFileName))
{
return 0;
}
//表示保存失败
return -2;
}
//表示源文件不存在
return -1;;
}
.h
#ifndef _PROCESS_IMAGE_H
#define _PROCESS_IMAGE_H
#include
#define LPCTSTR (const char*);
/****************************************************************************
结构体名称:IMAGEPARAMENT
int nWidth; //图像的宽度
int nHeight; //图像的高度
int nBitCount; //指定每个像素位数(BPP)的数量
int nBytesPerLine; //每行的字节数
int nBytesPerPixel; //每个像数的字节数
int nNumColors;
int nSize; //结构体的大小
****************************************************************************/
struct IMAGEPARAMENT
{
int nWidth;
int nHeight;
int nBitCount;
int nBytesPerLine;
int nBytesPerPixel;
int nNumColors;
int nSize;
};
typedef struct tagRGBQUAD {
char rgbBlue;
char rgbGreen;
char rgbRed;
char rgbReserved;
} RGBQUAD;
typedef RGBQUAD * LPRGBQUAD;
void GetImageParament(QImage *pImg,struct IMAGEPARAMENT *ppImgParam);
//void GetAllPalette(QImage *pSrcIma,QImage *pDesImg,RGBQUAD *ColorTab);
void SetRectValue(QImage *pImg,int x,int y,int Dx,int Dy,unsigned char *buf);
void SetAllPalette(QImage *pImg, RGBQUAD *ColorTab);
int InImage(QImage *pImg,int x,int y);
void ReSizeImage(QImage *imaDes, QImage *imaSource, float alpha) ;
//
int SavePictureToFile( QString pszSourceFileName , QString pszDesFileName );
#endif
注:该图像处理只是针对jgp的,并且可以根据alpha可以让图像缩小和放大
若‘色’友有什么不懂的地方,可以在下面进行评论,大家相互交流!