日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像的放大

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像的放大 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

根據書上理論基礎


圖像放大,比如原來是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


沒問題的,但是看書上提供的代碼,還是原來的問題,失真了,沒處理好像素

縮小與放大差不多,同理

說實話,這本書不怎么好,作者并沒有完全實現出來,不過根據書上提供的算法理論基礎,自己動手實現出來,才是最重要的,也能提高自己編碼能力,要不斷學習,持之以恒,共勉

總結

以上是生活随笔為你收集整理的图像的放大的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。