| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | #ifndef IMAGEBLUR_H#define IMAGEBLUR_H#include <QImage>class ImageBlurUtility{public:    //QImage存储数据的方式参考qrgb.h, 按AARRGGBB存    //unsigned int4字节, 刚好存放rgba    struct pixel_t    {        unsigned int rgba = 0;        inline int r() const { return ((rgba >> 16) & 0xff); }        inline int g() const { return ((rgba >> 8) & 0xff); }        inline int b() const { return (rgba & 0xff); }        inline int a() const { return rgba >> 24; }        inline void Set(int r, int g, int b, int a)        { rgba = ((a & 0xffu) << 24) | ((r & 0xffu) << 16) | ((g & 0xffu) << 8) | (b & 0xffu); }    };    //计算时用, 将整数的rgba值变为double类型来作计算, 最后再用qRound转回整数    struct buff_t    {        double r, g, b, a;        buff_t() : r(0.0), g(0.0), b(0.0), a(0.0) {}        buff_t(const pixel_t &pixel):r(pixel.r()),g(pixel.g()),b(pixel.b()),a(pixel.a()) {}        inline int Red() const { return qRound(r); }        inline int Green() const { return qRound(g); }        inline int Blue() const { return qRound(b); }        inline int Alpha() const { return qRound(a); }    };    public:    template <typename T>    static T Edge(T i, T x, T w);public:    static void Normalization(std::vector<double> &kernels);};class GaussBlur{public:    static void Blur(QImage &image, int radius);private:    static std::vector<double> GetKernels(int radius);};#endif // IMAGEBLUR_H
 |