我无法让Android的卷积滤镜正常运行。结果图像与应用某些蒙版后的图像相差甚远。无论选择何种滤波器,结果图像都会包含大量噪声,并且看起来不应该如此。这是我的卷积滤镜类:
import android.graphics.Bitmap;
import android.graphics.Color;
public class ConvolutionFilter {
public Bitmap apply_Mask(int[] mask, Bitmap image) {
int c;
Bitmap preview;
preview=image;
int r=0;
int g=0;
int b=0;
int weight=0;
int weightSum=0;
int counter=0;
for (int i = 0; i < mask.length; i++)
{
weightSum += (int)mask[i];
}
for (int i = 0; i < (image.getWidth()-1); i++)
{
for (int j = 0; j < (image.getHeight()-1); j++)
{
r = g = b = 0;
counter = 0;
for (int o = i - 1; o <= i + 1; o++)
{
for (int p = j - 1; p <= j + 1; p++)
{
if ((o == -1 && (p == -1 || p == image.getHeight())) || (o == image.getWidth() && (p == -1 || p == image.getHeight())))
c = image.getPixel(i, j);
else if (o == -1 || o == image.getWidth())
c = image.getPixel(i, p);
else if (p == -1 || p == image.getHeight())
c = image.getPixel(o, j);
else
c = image.getPixel(o, p);
weight = (int)mask[counter];
r += ( Color.red(c)* weight);
b += (Color.blue(c) * weight);
g += (Color.green(c) * weight);
counter++;
}
}
if (weightSum == 0)
weightSum = 1;
r = r / weightSum;
b = b / weightSum;
g = g / weightSum;
if (r < 0)
r = 0;
if (r > 255)
r = 255;
if (b < 0)
b = 0;
if (b > 255)
b = 255;
if (g < 0)
g = 0;
if (g > 255)
g = 255;
preview.setPixel(i, j, Color.rgb(r, g, b));
}
}
return preview;
}
}
以下是我如何使用它:
laplacian.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
Intent intent=getIntent();
final Uri uri=intent.getParcelableExtra("imageUri");
int[] laplacian = {
0, -1, 0,
-1, 4, -1,
0, -1, 0 };
String str=new String("Trwa przetwarzanie...");
Toast.makeText(FiltersMenu.this, str , Toast.LENGTH_SHORT).show();
Intent intent1=new Intent(FiltersMenu.this,DisplayingProcessedImage.class);
intent1.putExtra("filtr", laplacian);
intent1.putExtra("imageUri", uri);
startActivity(intent1);
}
});
最后,我在这里显示已编辑的图像,但结果与我的预期不同:
public class DisplayingProcessedImage extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_displaying_processed_image);
Intent intent=getIntent();
Uri uri=intent.getParcelableExtra("imageUri");
int[] filtr=intent.getIntArrayExtra("filtr");
String str=uri.toString();
Bitmap bitmap=BitmapFactory.decodeFile(str);
Bitmap bitmap2 = bitmap.copy(bitmap.getConfig(), true);
ConvolutionFilter filter=new ConvolutionFilter();
ImageView imgView;
imgView = (ImageView) findViewById(R.id.image);
imgView.setImageBitmap(filter.apply_Mask(filtr, bitmap2));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.displaying_processed_image, menu);
return true;
}
任何想法我可能做错了什么?我一直得到“Skipped xxx frames!应用程序可能在其主线程上做了太多工作”的消息。这是否意味着它跳过像素的某些计算?
问题已解决:正如有人在不同论坛上指出的那样,我正在对已修改的位图进行计算:
preview=image;
添加:
Bitmap preview=Bitmap.createBitmap(image);
解决了这个问题。