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;
}