马赛克算法

来源:互联网 发布:集合与数组的联系 编辑:程序博客网 时间:2024/04/30 08:53

工程中需要简单的马赛克算法模糊,看到网上的一些易读性不强,所以按自己的理解写了一个,调用了FreeImage的API,不过修改为直接操作BITMAP即可.

针对边界还没有完善,后面会再回头完善一下


        DWORD mosaic_size = 12; // 默认12        auto w = FreeImage_GetWidth(dibMosaic);        auto h = FreeImage_GetHeight(dibMosaic);                DWORD max_grid_x = ceil(w * 1.0 / mosaic_size);        DWORD max_grid_y = ceil(h * 1.0 / mosaic_size);        DWORD max_grid_xy = max_grid_x * max_grid_y;        DWORD* sum_r = new DWORD[max_grid_xy];        DWORD* sum_g = new DWORD[max_grid_xy];        DWORD* sum_b = new DWORD[max_grid_xy];        DWORD* sum_a = new DWORD[max_grid_xy];        memset(sum_r, 0, sizeof(DWORD)*max_grid_xy);        memset(sum_g, 0, sizeof(DWORD)*max_grid_xy);        memset(sum_b, 0, sizeof(DWORD)*max_grid_xy);        memset(sum_b, 0, sizeof(DWORD)*max_grid_xy);        for (auto y = 0; y < h; ++y) {            for (auto x = 0; x < w; ++x) {                RGBQUAD value;                BOOL suc = FreeImage_GetPixelColor(dibMosaic, x, y, &value);                ASSERT(suc);                DWORD grid_xy_index = (y / mosaic_size) * max_grid_x + (x / mosaic_size);                sum_r[grid_xy_index] += value.rgbRed;                sum_g[grid_xy_index] += value.rgbGreen;                sum_b[grid_xy_index] += value.rgbBlue;                sum_a[grid_xy_index] += value.rgbReserved;            }        }        BYTE* avg_r = new BYTE[max_grid_xy];        BYTE* avg_g = new BYTE[max_grid_xy];        BYTE* avg_b = new BYTE[max_grid_xy];        BYTE* avg_a = new BYTE[max_grid_xy];        int sum_matrix = (mosaic_size * mosaic_size);        while (max_grid_xy--) {            avg_r[max_grid_xy] = sum_r[max_grid_xy] / sum_matrix;            avg_g[max_grid_xy] = sum_g[max_grid_xy] / sum_matrix;            avg_b[max_grid_xy] = sum_b[max_grid_xy] / sum_matrix;            avg_a[max_grid_xy] = sum_a[max_grid_xy] / sum_matrix;        }        for (auto y = 0; y < h; ++y) {            for (auto x = 0; x < w; ++x) {                DWORD grid_xy_index = (y / mosaic_size) * max_grid_x + (x / mosaic_size);                RGBQUAD value = { avg_b[grid_xy_index],  avg_g[grid_xy_index],                    avg_r[grid_xy_index],  avg_a[grid_xy_index] };                //FreeImage_GetPixelColor(dibMosaic, x, y, &value);                value.rgbBlue   = avg_b[grid_xy_index];                value.rgbGreen  = avg_g[grid_xy_index];                value.rgbRed    = avg_r[grid_xy_index];                value.rgbReserved = avg_a[grid_xy_index];                BOOL suc = FreeImage_SetPixelColor(dibMosaic, x, y, &value);                           }        }        delete[] sum_r;        delete[] sum_g;        delete[] sum_b;        delete[] sum_a;        delete[] avg_r;        delete[] avg_g;        delete[] avg_b;        delete[] avg_a;




原创粉丝点击