图形与图像编程(四)-图像特效

xiaoxiao2021-02-28  153

一、图像锐化处理

//图像锐化处理 void CGDIEffectSampleView::OnMenuitemRuihua() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Bitmap oldBitmap(L"girl.JPG"); status = oldBitmap.GetLastStatus(); if (status != Ok) return; UINT width = oldBitmap.GetWidth(); UINT height = oldBitmap.GetHeight(); Bitmap newBitmap(width, height); Color pixel1, pixel2, pixel; graphics.DrawImage(&oldBitmap, 10, 0, width, height); int Laplacian[] ={ -1, -1, -1, -1, 9, -1, -1, -1, -1 };//拉普拉斯模板 for (int x = 1; x < (int)width - 1; x++) { for (int y = 1; y < (int)height - 1; y++) { int r = 0, g = 0, b = 0; int Index = 0; for (int col = -1; col <= 1; col++) for (int row = -1; row <= 1; row++) { oldBitmap.GetPixel(x + row, y + col, &pixel); r += pixel.GetRed() * Laplacian[Index]; g += pixel.GetGreen() * Laplacian[Index]; b += pixel.GetBlue() * Laplacian[Index]; Index++; } if ( r > 255 ) r = 255; else if ( r < 0 ) r = -r; if ( g > 255 ) g = 255; else if ( g < 0 ) g = -g; if ( b > 255 ) b = 255; else if ( b < 0 ) b = -b; pixel.SetFromCOLORREF(RGB(r, g, b)); newBitmap.SetPixel(x - 1, y - 1, pixel); } } graphics.DrawImage(&newBitmap, width+20, 0, width, height); }

二、图像柔化处理

//图像柔化处理 void CGDIEffectSampleView::OnMenuitemRouhua() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Bitmap oldBitmap(L"girl.JPG"); status = oldBitmap.GetLastStatus(); if (status != Ok) return; UINT width = oldBitmap.GetWidth(); UINT height = oldBitmap.GetHeight(); Bitmap newBitmap(width, height); Color pixel1, pixel2, pixel; graphics.DrawImage(&oldBitmap, 10, 0, width, height); int smoothGauss[9] = {1,2,1,2,4,2,1,2,1}; // 高斯模板 for (int x = 1; x < (int)width - 1; x++) { for (int y = 1; y < (int)height - 1; y++) { int r = 0, g = 0, b = 0; int Index = 0; for (int col = -1; col <= 1; col++) for (int row = -1; row <= 1; row++) { oldBitmap.GetPixel(x + row, y + col, &pixel); r += pixel.GetRed() * smoothGauss[Index]; g += pixel.GetGreen() * smoothGauss[Index]; b += pixel.GetBlue() * smoothGauss[Index]; Index++; } r = (r/16); g = (g/16); b = (b/16); if ( r > 255 ) r = 255; else if ( r < 0 ) r = -r; if ( g > 255 ) g = 255; else if ( g < 0 ) g = -g; if ( b > 255 ) b = 255; else if ( b < 0 ) b = -b; pixel.SetFromCOLORREF(RGB(r, g, b)); newBitmap.SetPixel(x - 1, y - 1, pixel); } } graphics.DrawImage(&newBitmap, width+20, 0, width, height); }

三、图像反色处理

//图像反色处理 void CGDIEffectSampleView::OnMenuitemFanse() { //创建反色图像的颜色矩阵 ColorMatrix colorMatrix = { -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); ImageAttributes imageAttributes; Rect destRect1(width+20, 10, width, height); imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); graphics.DrawImage(&image, 10, 10, width, height); graphics.DrawImage(&image, destRect1, 0, 0, width, height, UnitPixel,&imageAttributes); }

四、图像灰度处理

//图像灰度处理 void CGDIEffectSampleView::OnMenuitemHuidu() { //创建灰度图像的颜色矩阵 ColorMatrix colorMatrix = { 0.299f, 0.299f, 0.299f, 0.0f, 0.0f, 0.587f, 0.587f, 0.587f, 0.0f, 0.0f, 0.114f, 0.114f, 0.114f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); ImageAttributes imageAttributes; Rect destRect1(width+20, 10, width, height); imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); graphics.DrawImage(&image, 10, 10, width, height); graphics.DrawImage(&image, destRect1, 0, 0, width, height, UnitPixel, &imageAttributes); }

五、图像浮雕处理

//图像浮雕效果 void CGDIEffectSampleView::OnMenuitemFudiao() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Bitmap oldBitmap(L"girl.JPG"); status = oldBitmap.GetLastStatus(); if (status != Ok) return; UINT width = oldBitmap.GetWidth(); UINT height = oldBitmap.GetHeight(); Bitmap newBitmap(width, height); Color pixel1, pixel2, pixel; graphics.DrawImage(&oldBitmap, 10, 0, width, height); for (int x = 0; x < (int)width-1; x++) { for (int y = 0; y < (int)height-1; y++) { int r = 0, g = 0, b = 0; oldBitmap.GetPixel(x, y, &pixel1); oldBitmap.GetPixel(x + 1, y + 1, &pixel2); r = abs(pixel1.GetRed() - pixel2.GetRed() + 128); g = abs(pixel1.GetGreen() - pixel2.GetGreen() + 128); b = abs(pixel1.GetBlue() - pixel2.GetBlue() + 128); if (r > 255) r = 255; if (r < 0) r = 0; if (g > 255) g = 255; if (g < 0) g = 0; if (b > 255) b = 255; if (b < 0) b = 0; pixel.SetFromCOLORREF(RGB(r, g, b)); newBitmap.SetPixel(x, y, pixel); } } graphics.DrawImage(&newBitmap, width+20, 0, width, height); }

六、图像翻转

//图像翻转 void CGDIEffectSampleView::OnMenuitemReserve() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); graphics.DrawImage(&image, 10, 0, width, height); image.RotateFlip(Rotate180FlipX); width = image.GetWidth(); height = image.GetHeight(); graphics.DrawImage(&image, 20 + width, 0, width, height); }

七、图像缩放

//图像缩放 void CGDIEffectSampleView::OnMenuitemResize() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); graphics.DrawImage(&image, 0, 0, width, height); graphics.DrawImage(&image, width, 0, (int)0.75 * width, (int)0.75 * height); }

八、图像剪切

//图片剪切 void CGDIEffectSampleView::OnMenuitemCut() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); Rect destRect1(width+20, 20, 30, 30); //小范围 Rect destRect2(width+20, 100, 120, 120); //大范围 graphics.DrawImage(&image, 0, 0, width, height);//原始图像 graphics.DrawImage(&image, destRect1, 87, 123, 35, 35, UnitPixel);//缩小剪切 graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear); graphics.DrawImage(&image, destRect2, 87, 123, 35, 35, UnitPixel);//放大剪切 }

九、图像马赛克

//图片马赛克效果 void CGDIEffectSampleView::OnMenuitemMasaike() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; graphics.Clear(Color::White); Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); int dw = width / 50; int dh = height / 50; int points[2500]={0}; int nCount=0; while(nCount < 2500) { int index = rand()%00; if (points[index] == 0) { nCount ++; points[index] = 1; int m = index/50; int n = indexP; Rect destRect(dw*m, dh*n, (m+1)*dw, (n+1)*dh); graphics.DrawImage(&image, destRect, dw*m, dh*n, (m+1)*dw, (n+1)*dh, UnitPixel); } Sleep(10); } }

十、垂直百叶窗

//垂直百叶窗显示图片 void CGDIEffectSampleView::OnMenuitemVbaiye() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; graphics.Clear(Color::White); Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); int nPixes = 15; int nNum = width/nPixes; for (int i = 0;i <nPixes; i++) { for(int j=0;j<nNum;j++) { //分别扫描每条 Rect destRect1(0, j*nPixes+i, width, 1); graphics.DrawImage(&image, destRect1, 0, j*nPixes+i, width, 1, UnitPixel); } Sleep(50); } }

十一、水平百叶窗

//水平百叶窗显示图片 void CGDIEffectSampleView::OnMenuitemHbaiye() { Status status = GenericError; Graphics graphics(m_hWnd); status = graphics.GetLastStatus(); if (status != Ok) return; graphics.Clear(Color::White); Image image(L"girl.JPG"); status = image.GetLastStatus(); if (status != Ok) return; UINT width = image.GetWidth(); UINT height = image.GetHeight(); int nPixes = 30; int nNum = width/nPixes; for (int i = 0;i <nPixes; i++) { for(int j=0;j<nNum;j++) {//分别扫描每条 Rect destRect1(j*nPixes+i, 0, 1, height); graphics.DrawImage(&image, destRect1, j*nPixes+i, 0, 1, height, UnitPixel); } Sleep(10); } }
转载请注明原文地址: https://www.6miu.com/read-38774.html

最新回复(0)