I see what you mean, my idea was to apply the convolution only on the border places:
const auto loaded = ImageCache::getFromFile (File::getSpecialLocation(File::userPicturesDirectory).getChildFile ("Mietzi.jpg")).rescaled (1024, 768);
image = loaded.createCopy();
auto borderWidth = std::min (image.getWidth(), image.getHeight()) * 0.1f;
auto bounds = image.getBounds();
ImageConvolutionKernel gauss (15);
gauss.createGaussianBlur (7.0f);
gauss.applyToImage (image, loaded, bounds.removeFromTop (borderWidth));
gauss.applyToImage (image, loaded, bounds.removeFromBottom (borderWidth));
gauss.applyToImage (image, loaded, bounds.withWidth (borderWidth));
gauss.applyToImage (image, loaded, bounds.withX (bounds.getRight() - borderWidth));
If you do that in place, you get artefacts, but if you get the input pixels from a copy, it looks ok to me.
An alternative is to run the filter and copy the unblurred part into, which is a bit of a waste.