这里使用的是Laplace算子:
Skia的实现如下:
#include "SkMatrixConvolutionImageFilter.h"
void draw(SkCanvas* canvas) {
SkScalar kernel[9] = {
SkIntToScalar(-1), SkIntToScalar(-1), SkIntToScalar(-1),
SkIntToScalar(-1), SkIntToScalar(8), SkIntToScalar(-1),
SkIntToScalar(-1), SkIntToScalar(-1), SkIntToScalar(-1),
};
SkISize kernelSize = SkISize::Make(3, 3);
SkScalar gain = 1.0f, bias = SkIntToScalar(0);
SkIPoint kernelOffset = SkIPoint::Make(1, 1);
auto tileMode = SkMatrixConvolutionImageFilter::kClamp_TileMode;
bool convolveAlpha = false;
sk_sp<SkImageFilter> convolve(SkMatrixConvolutionImageFilter::Make(
kernelSize, kernel, gain, bias, kernelOffset, tileMode, convolveAlpha,
nullptr));
SkPaint paint;
SkIRect subset = image->bounds();
SkIRect clipBounds = image->bounds();
SkIRect outSubset;
SkIPoint offset;
sk_sp<SkImage> filtered(image->makeWithFilter(
convolve.get(), subset, clipBounds, &outSubset, &offset));
paint.setAntiAlias(true);
paint.setStyle(SkPaint::kStroke_Style);
canvas->drawImage(filtered, 0, 0);
}