Ich verwende das Renderscript, um die Gaußsche Unschärfe auf einem Bild zu machen. aber egal was ich getan habe. Die ScriptIntrinsicBlur ist mehr schneller. Warum ist das passiert? ScriptIntrinsicBlur verwendet eine andere Methode? diese id meine RS-Code:Warum ist ScriptIntrinsicBlur schneller als meine Methode?
#pragma version(1)
#pragma rs java_package_name(top.deepcolor.rsimage.utils)
//aussian blur algorithm.
//the max radius of gaussian blur
static const int MAX_BLUR_RADIUS = 1024;
//the ratio of pixels when blur
float blurRatio[(MAX_BLUR_RADIUS << 2) + 1];
//the acquiescent blur radius
int blurRadius = 0;
//the width and height of bitmap
uint32_t width;
uint32_t height;
//bind to the input bitmap
rs_allocation input;
//the temp alloction
rs_allocation temp;
//set the radius
void setBlurRadius(int radius)
{
if(1 > radius)
radius = 1;
else if(MAX_BLUR_RADIUS < radius)
radius = MAX_BLUR_RADIUS;
blurRadius = radius;
/**
calculate the blurRadius by Gaussian function
when the pixel is far way from the center, the pixel will not contribute to the center
so take the sigma is blurRadius/2.57
*/
float sigma = 1.0f * blurRadius/2.57f;
float deno = 1.0f/(sigma * sqrt(2.0f * M_PI));
float nume = -1.0/(2.0f * sigma * sigma);
//calculate the gaussian function
float sum = 0.0f;
for(int i = 0, r = -blurRadius; r <= blurRadius; ++i, ++r)
{
blurRatio[i] = deno * exp(nume * r * r);
sum += blurRatio[i];
}
//normalization to 1
int len = radius + radius + 1;
for(int i = 0; i < len; ++i)
{
blurRatio[i] /= sum;
}
}
/**
the gaussian blur is decomposed two steps:1
1.blur in the horizontal
2.blur in the vertical
*/
uchar4 RS_KERNEL horizontal(uint32_t x, uint32_t y)
{
float a, r, g, b;
for(int k = -blurRadius; k <= blurRadius; ++k)
{
int horizontalIndex = x + k;
if(0 > horizontalIndex) horizontalIndex = 0;
if(width <= horizontalIndex) horizontalIndex = width - 1;
uchar4 inputPixel = rsGetElementAt_uchar4(input, horizontalIndex, y);
int blurRatioIndex = k + blurRadius;
a += inputPixel.a * blurRatio[blurRatioIndex];
r += inputPixel.r * blurRatio[blurRatioIndex];
g += inputPixel.g * blurRatio[blurRatioIndex];
b += inputPixel.b * blurRatio[blurRatioIndex];
}
uchar4 out;
out.a = (uchar) a;
out.r = (uchar) r;
out.g = (uchar) g;
out.b = (uchar) b;
return out;
}
uchar4 RS_KERNEL vertical(uint32_t x, uint32_t y)
{
float a, r, g, b;
for(int k = -blurRadius; k <= blurRadius; ++k)
{
int verticalIndex = y + k;
if(0 > verticalIndex) verticalIndex = 0;
if(height <= verticalIndex) verticalIndex = height - 1;
uchar4 inputPixel = rsGetElementAt_uchar4(temp, x, verticalIndex);
int blurRatioIndex = k + blurRadius;
a += inputPixel.a * blurRatio[blurRatioIndex];
r += inputPixel.r * blurRatio[blurRatioIndex];
g += inputPixel.g * blurRatio[blurRatioIndex];
b += inputPixel.b * blurRatio[blurRatioIndex];
}
uchar4 out;
out.a = (uchar) a;
out.r = (uchar) r;
out.g = (uchar) g;
out.b = (uchar) b;
return out;
}
1. Wie haben Sie Ihre Tests durchgeführt? 2. Auf welcher Hardware/welchem Emulator testen Sie? 3. Wenn auf dem Gerät - berücksichtigen Sie, dass ODM ScriptIntrinsics mit zusätzlichen Hardwareressourcen implementieren kann, die App-Entwicklern nicht zur Verfügung stehen. –
Ich teste in einem echten Telefon nach einem Bild (293x220). meine Methode kostet etwa 120ms –
was ist der Mittelwert von ODM? Ich teste in einem echten Telefon nach einem Bild (293x220), Blur Radius ist 20. Meine Methode kostet etwa 120ms. Die ScriptIntrinsicBlur kostete etwa 25 ms. Ich fand, dass die Methode copyTo() zu viel Zeit kostete (ScriptIntrinsicBlur verwendet die Methode ebenfalls, aber es kostet wenig Zeit). nebenbei, wo finde ich den RS Quellcode über die ScriptIntrinsicBlur? –