在imageView中调用图像导致结果图像损坏。

3

我正在使用Android NDK和OpenCV。

我有两个输入图像和一个输出图像。

第一个输入图像是普通图像,第二个图像是小插画效果的图像。

我从Java端得到某种逻辑错误。

以下是我的Java代码:

public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

         imageview_1=(ImageView) findViewById(R.id.imageView1);
         imageview_2=(ImageView) findViewById(R.id.imageView2);

        InputStream is , Vign;
        is = this.getResources().openRawResource(R.drawable.me);
        final Bitmap bmInImg = BitmapFactory.decodeStream(is);
        Vign = this.getResources().openRawResource(R.drawable.p);
        final Bitmap bmInImg2 = BitmapFactory.decodeStream(Vign);

        mPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
        nPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
        vPhotoIntArray = new int[bmInImg2.getWidth() * bmInImg2.getHeight()];
        imageview_1.setImageBitmap(bmInImg);
        // Copy pixel data from the Bitmap into the 'intArray' array
        bmInImg.getPixels(mPhotoIntArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());
        bmInImg2.getPixels(vPhotoIntArray, 0, bmInImg2.getWidth(), 0, 0, bmInImg2.getWidth(), bmInImg2.getHeight());

        mCannyOutArray = new int[bmInImg2.getWidth() * bmInImg2.getHeight()];
        final Bitmap bmOutImg = Bitmap.createBitmap(bmInImg2.getWidth(), bmInImg2.getHeight(), Config.ARGB_8888);  
        bmOutImg.setPixels(mCannyOutArray, 0, bmInImg2.getWidth(), 0, 0, bmInImg2.getWidth(), bmInImg2.getHeight());

        Button button= (Button) findViewById(R.id.NextButton);
        button.setOnClickListener(new OnClickListener() {

            @Override
        public void onClick(View v)  {  

                if (count ==0)
                {
                    Vig(bmInImg.getHeight(),bmInImg.getWidth(),bmInImg2.getHeight(),bmInImg2.getWidth(), mPhotoIntArray,vPhotoIntArray, mCannyOutArray); 

                    bmOutImg.setPixels(mCannyOutArray, 0, bmInImg2.getWidth(), 0, 0, bmInImg2.getWidth(), bmInImg2.getHeight());    
                    imageview_2.setImageBitmap(bmOutImg);        
                }

                count++;        
            }
            }); 

        String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        String outFileName = extStorageDirectory + "/me.png";
        OutputBitmapToFile(bmOutImg, outFileName);      
    }

上述代码输出了漂亮的暗角效果,但第一张图片显示出了所有图像的衬里线。当我添加两张图片时,暗角看起来很好,但是暗角内的图像(image1)却充满了线条。如果我将bmOutImg.setPixels的代码从外部和内部条件if更改为...
Vig(bmInImg.getHeight(),bmInImg.getWidth(),bmInImg2.getHeight(),bmInImg2.getWidth(), mPhotoIntArray,vPhotoIntArray, mCannyOutArray); 

bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());   
                        imageview_2.setImageBitmap(bmOutImg);

然后它会在渐晕图像上显示衬里。我的`mCannyOutArray`应该是什么,这样当我添加vig+image1时,两个图像都可以给出满意的输出结果。
Vig是: enter image description here img1是: enter image description here 输出结果为: enter image description here main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:contentDescription="@null" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="235dp"
        android:layout_height="208dp"
        android:layout_weight="0.10"
        android:contentDescription="@null" />

</LinearLayout>

1
俗话说,一张图片胜过千言万语。 - Bull
我会附上图片进行更新。 - AHF
1
vigimg1 具有相同的尺寸时,问题是否仍然存在? - karlphillip
嘿@karlphillip,很高兴在我的问题上见到你,我正在阅读你的答案,是的,如果我们使用img1的尺寸作为输出,那么输出中将不会显示“vig”。 - AHF
很遗憾,我的系统没有正确设置以运行您的代码,所以我只是猜测可能出了什么问题。在进行任何操作之前,非常重要的是确保vigimg1被创建(或缩放)为完全相同的尺寸。当然,output应该具有与输入图像相同的尺寸。 - karlphillip
显示剩余4条评论
1个回答

1
首先,您需要确定问题出在哪里:
  • 是在 vignette 滤镜的实现上吗?
  • 还是在图片在屏幕上显示的方式上?
为了帮助您解决这个问题,请确保在进行任何处理之前,vigimg1 具有相同的尺寸。将这些图像保存到磁盘并检查它们的宽度/高度值。
然后执行您的滤镜,并在其显示在屏幕上之前将输出图像保存到硬盘。如果保存的图像看起来正常,则可以确定问题是图片的显示方式。
一段时间以前,我使用 C++ 和 OpenCV 实现了一个 vignette 滤镜,您可以查看源代码并将其与您正在做的内容进行比较。以下是一个示例: 输入:

输出:


是的,那个答案也在我的问题上,但这里的情况不同,vignette图像是Photoshop的一个独立的4通道图像,我正在尝试使用这里的逻辑实现它http://stackoverflow.com/questions/23801988/merging-two-images-showing-brightness,我在我的Java端识别了上面提到的问题,因为我的`c++ jni代码`工作正常,但如何调整两个位图大小?首先将它们转换为Mat?在Java中,这些过滤器对我在Windows上起作用,在Androoid中遇到问题。 - AHF
抱歉,由于我在JNI方面缺乏经验,无法再为您提供更多帮助。如果我是您,我会查看用于存储图像的数据类型文档,并查看是否提供了调整图像大小的方法。 - karlphillip
那个逻辑是两张图片应该是相同大小的,这对我有用,我只是手动使用了相同大小的两张图片,现在我进一步检查如何在Java中调整两张图片的大小,谢谢。 - AHF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接