c语言缩放图片
㈠ 用c语言怎么把bmp格式的图片放大,因为在做图片识别需要放大截取的放大为统一大小。
原型:
int WINAPI icePub_imgZoom(char *strImgFilename,char *strBmpFilename,int newWidth,int newHeight,int flag)
输入:strImgFilename 待处理图像文件名
strBmpFilename 结果bmp文件名
newWidth 新图宽
newHeight 新图高
flag 0 等比缩放; 1 完全缩放
输出:
typedef int (WINAPI ICEPUB_IMGZOOM)(char *strImgFilename,char *strBmpFilename,int newWidth,int newHeight,int flag);
ICEPUB_IMGZOOM *icePub_imgZoom = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_imgZoom=(ICEPUB_IMGZOOM *)GetProcAddress(hDLLDrv,"icePub_imgZoom");
}
if(icePub_imgZoom)
{
icePub_imgZoom("a.jpg","a1.bmp",100,100,0);
icePub_imgZoom("d.png", "d1.bmp",50.80,1);
}
if(hDLLDrv)
FreeLibrary(hDLLDrv);
㈡ C语言中调用bmp图片时能否设置图片显示的大小与位置最好有直接可以使用的函数!
1.使用MFC相关的控件或者用GDI+的类加载bmp图片大小实现缩放功能(比较简单),参考下面代码
//建立图形对象
GraphicsmGraphics(dc.GetSafeHdc());
//装入图像文件
Imageimg(L"./res/test.jpg",TRUE);
//在指定区域pdestPoints显示图像
/*//根据背景大小按比例缩放
CRectrcClient;
GetClientRect(&rcClient);
BOOLbWidth=rcClient.Width()/img.GetWidth()>rcClient.Height()/img.GetHeight();
if(bWidth)
{
mGraphics.DrawImage(&img,0,0,rcClient.Width(),rcClient.Width()*img.GetHeight()/img.GetWidth());
}
else
{
mGraphics.DrawImage(&img,0,0,rcClient.Height()*img.GetWidth()/img.GetHeight(),rcClient.Height());
}
2.自己实现
搜索双线性插值或者三线性插值算法,搞明白再写代码
㈢ 求C语言实现图像缩放的程序,最好是双线性插值的
directX 3d 和opengl都可实现,对纹理采样进行设置.
directx3d 9的
IDirect3DDevice9::SetSamplerState
这个方法可实现这个功能.
㈣ 如何用c语言实现压缩图片内存大小
是(row,col,value),这样把所有不为零的值组成一个向量。这种存储方式比二维数组节省了不少空间,当然还可以进一步节省,因为三元组里面row或者col重复存储了,一行或者一列存一次就行了,按这种思路走下去就是行压缩存储了。
那具体什么是行压缩存储呢?行压缩存储的思想就是,把所有不为零的值按行访问的顺序组成一个向量,然后再把每一行值不为0的列的下标存下来,这个两个向量的大小和稀疏矩阵中不为0的值得个数相同,当然要实现对行压缩矩阵的访问,还要把每一行的不为0的列的下标在第二个向量中开始的位置存下来,有人把这个叫做指针。有了这三个向量就可以实现对矩阵实现高效的按行访问了。行压缩存储比三元组优秀的不仅是空间的压缩,还有就是行访问时的高效。三元组如果是有序的,可以二分查找来访问一行,但是行压缩存储按行访问时的时间复杂度是常数级的。 大家可以参考下面这个行压缩矩阵示意图:
㈤ 这个关于c语言的看图片
图片很模糊,下载了放大也看不清楚,为什么不复制代码贴上来呢
㈥ 用c语言编写代码能解决下面图片的问题。
你编译的是.cpp文件(是C ++文件),而你创建的不是C++的环境,你可以试着先建立文件再自动让编译器在编译时选择所需创建的工程环境。
㈦ 如何用实现图片的放大缩小与去阴影能用C语言写出实现的算法吗
bmp图片, 缩小没有问题, 根据缩小比例计算然后采样组成新文件就行了. .
放大的话会失真, 其实就是根据比例重新计算坐标对应位置并插值.
这两个难度不大,但用C写代码不少. 建议你可以自己动手,任何不会的环节都可以追问.因为一般回答懒得给你敲几百行代码.
去阴影不知道你指的是什么.
㈧ 怎样用c语言对bmp图像进行线性拉伸
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
usingnamespacestd;
usingnamespacecv;
MatXianChange(Mat&img,doublealt,intbase)//灰度线性变化、
{
CV_Assert(img.depth()!=sizeof(uchar));//声明只对深度8bit的图像操作
Mattemp=img.clone();
intchannels=img.channels();//获取图像channel
intnrows=img.rows;//矩阵的行数
intncols=img.cols*channels;//矩阵的总列数=列数*channel分量数
if(img.isContinuous())//判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
ncols*=nrows;
nrows=1;//一维数组
}
//遍历像素点灰度值
for(inti=0;i<nrows;i++)
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
p[j]=alt*p[j]+base;//修改灰度值
if(p[j]>255)
p[j]=255;
if(p[j]<0)
p[j]=0;
}
}
returntemp;
}
MatXianStretch(Mat&img,inta,intb,intc,intd)//线性灰度拉伸,将[a,b]拉伸到[c,d]
{
CV_Assert(img.depth()!=sizeof(uchar));//声明只对深度8bit的图像操作
Mattemp=img.clone();
intchannels=img.channels();//获取图像channel
intnrows=img.rows;//矩阵的行数
intncols=img.cols*channels;//矩阵的总列数=列数*channel分量数
if(img.isContinuous())//判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
ncols*=nrows;
nrows=1;//一维数组
}
//遍历像素点灰度值
for(inti=0;i<nrows;i++)
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
if(p[j]<a)
p[j]=c/b*p[j];
elseif(p[j]>a&&p[j]<b)
p[j]=(d-c)/(b-a)*(p[j]-a)+c;
else
p[j]=(255-d)/(255-b)*(p[j]-b)+d;
}
}
returntemp;
}
MatHistogramEqu(Mat&img)//直方均衡
{
CV_Assert(img.depth()!=sizeof(uchar));//声明只对深度8bit的图像操作
Mattemp=img.clone();
intgrayNum[260]={0};
intgrayMap[260]={0};
intchannels=img.channels();//获取图像channel
intnrows=img.rows;//矩阵的行数
intncols=img.cols*channels;//矩阵的总列数=列数*channel分量数
intallPixel=nrows*ncols;//图像的像素总数
intc;//用于计算累积分布概率
if(img.isContinuous())//判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
ncols*=nrows;
nrows=1;//一维数组
}
//遍历像素点灰度值
for(inti=0;i<nrows;i++)
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
grayNum[p[j]]++;//原图像的直方图
}
}
for(inti=0;i<256;i++)//重新定义新的直方图
{
c=0;
for(intj=0;j<=i;j++)
{
c+=grayNum[j];
grayMap[i]=int(255*c/allPixel);
}
//printf("%d%d ",i,grayMap[i]);
} for(inti=0;i<nrows;i++)//重新定义新的直方图
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
p[j]=grayMap[p[j]];
}
}
returntemp;
}
intmain()
{
stringpicName="lena256.jpg";
MatA=imread(picName,CV_LOAD_IMAGE_GRAYSCALE);//读入灰度图像
imshow("变换前",A);
MatB=XianChange(A,1,20);//根据需要设置不同的参数
imshow("线性变换后",B);
MatC=XianStretch(A,10,100,20,50);//根据需要设置不同的参数
imshow("线性拉伸后",C);
MatD=HistogramEqu(A);
imshow("直方均衡后",D);
waitKey();
return0;
}
㈨ C语言怎么处理图片
想操作的,主要是操作像素点。根据矩阵位置可以做局部数据的调整
㈩ C语言题(纸张缩放)
题目中说的是C 不过保存的是cpp
按照C++写了
如果必须C的话 改一下头文件和输入输出就好了
#include<iostream>
usingstd::cin;
usingstd::cout;
intmain()
{
intt,a,b,c,d,i;
cin>>t;
while(t--)
{
cin>>c>>d>>a>>b;
if((a>=b)!=(c>=d))
i=c,c=d,d=i;
if(a>=c&&b>=d)cout<<100;
else
{
a=a*100/c;
b=b*100/d;
if(a>b)cout<<b;
elsecout<<a;
}
cout<<"% ";
}
return0;
}