生活随笔
收集整理的這篇文章主要介紹了
图像的放大
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
根據書上理論基礎
圖像放大,比如原來是3*3的圖像,水平放大2倍,垂直放大2倍,那么原來的一個像素對應的在新圖像中的4個像素,如圖
那么相應的新,舊坐標對應如下:
//原坐標(x0,y0)->新坐標(x1,y1)int x0 = i;int y0 = j;int x1 = kx*i + ix;int y1 = ky*j + iy;
然后算法就很明了了,由于像素位大小改變了,所以需要創建一個位圖,然后寫入新的像素位,對應每一個舊的像素,寫入4個新的像素(仍然要注意,每個像素由4個值組成)
算法如下:
//===============函數定義=====================
//圖像的放大
//kx水平放大倍數,ky為垂直放大倍數
void magnify(HDC hdc, HDC hMemDC, HBITMAP hBitmap, int Width, int Heigh,int kx,int ky)
{BITMAP bm;GetObject(hBitmap, sizeof(bm), &bm);int WidthRow = bm.bmWidthBytes;//原位圖的字節寬(即原位圖的每行字節數)//獲取原位圖的像素位BYTE *Pixel = new BYTE[WidthRow*Heigh];GetBitmapBits(hBitmap, WidthRow*Heigh, (LPVOID)Pixel);if (kx < 1 || ky < 1)exit(0);BYTE *newPixel = new BYTE[kx*ky*WidthRow*Heigh];//存放新的像素位memset(newPixel,255,kx*ky*WidthRow*Heigh*sizeof(BYTE));//圖像放大,for (int j = 0; j <Heigh; j++)//行for (int i = 0; i < Width; i++)//列{//將原圖中j行i列處像素復制到新圖中的ky*j行kx*i列附近的kx*ky個像素for(int ix=0;ix<kx;ix++)for (int iy = 0; iy < ky; iy++){//原坐標(x0,y0)->新坐標(x1,y1)int x0 = i;int y0 = j;int x1 = kx*i + ix;int y1 = ky*j + iy;//每4個為一個像素位for (int k = 0; k <4; k++){//新位圖寬為kx*WidthnewPixel[y1*kx*WidthRow + 4 * x1 + k] =Pixel[y0*WidthRow + 4 * x0 + k];}}}//創建一個新的位圖HBITMAP hNewBitmap = CreateCompatibleBitmap(hdc,kx*Width,ky*Heigh);SelectObject(hMemDC, hNewBitmap);//選進內存DCSetBitmapBits(hNewBitmap, kx*ky*WidthRow*Heigh, newPixel);BitBlt(hdc, 0, 0, kx*Width, ky*Heigh, hMemDC, 0, 0, SRCCOPY);DeleteObject(hNewBitmap);delete[] Pixel;delete[] newPixel;
}
效果如下(cx為水平放大倍數,cy為垂直放大倍數)
cx=1,cy=3
cx=1,cy=2
cx=2,cy=2
沒問題的,但是看書上提供的代碼,還是原來的問題,失真了,沒處理好像素
縮小與放大差不多,同理
說實話,這本書不怎么好,作者并沒有完全實現出來,不過根據書上提供的算法理論基礎,自己動手實現出來,才是最重要的,也能提高自己編碼能力,要不斷學習,持之以恒,共勉
總結
以上是生活随笔為你收集整理的图像的放大的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。