Color Banding Android Solution

前端 未结 1 1885
野的像风
野的像风 2020-12-20 06:53

What is possible solution to banded images in Android Activity or in OpenGl.

Look at the answer below.

Hope it Helps

相关标签:
1条回答
  • 2020-12-20 06:57

    Color Banding Solved ooooooooooyyyyyyyeaaaaaaaaaa

    I solved color banding in two phases

    1) * when we use the BitmapFactory to decode resources it decodes the resource in RGB565 which shows color banding, instead of using ARGB_8888, so i used BitmapFactory.Options for setting the decode options to ARGB_8888

    second problem was whenever i scaled the bitmap it again got banded

    2) This was the tough part and took a lot of searching and finally worked * the method Bitmap.createScaledBitmap for scaling bitmaps also reduced the images to RGB565 format after scaling i got banded images(the old method for solving this was using at least one transparent pixel in a png but no other format like jpg or bmp worked)so here i created a method CreateScaledBitmap to scale the bitmap with the original bitmaps configurations in the resulting scale bitmap(actually i copied the method from a post by logicnet.dk and translated in java)

        BitmapFactory.Options myOptions = new BitmapFactory.Options();
        myOptions.inDither = true;
        myOptions.inScaled = false;
        myOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//important
        //myOptions.inDither = false;
        myOptions.inPurgeable = true;
        Bitmap tempImage =  
        BitmapFactory.decodeResource(getResources(),R.drawable.defaultart, myOptions);//important
    
        //this is important part new scale method created by someone else
        tempImage = CreateScaledBitmap(tempImage,300,300,false);
    
        ImageView v = (ImageView)findViewById(R.id.imageView1);
        v.setImageBitmap(tempImage);
    

    // the function

    public static Bitmap CreateScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)
    {
        Matrix m = new Matrix();
        m.setScale(dstWidth  / (float)src.getWidth(), dstHeight / (float)src.getHeight());
        Bitmap result = Bitmap.createBitmap(dstWidth, dstHeight, src.getConfig());
        Canvas canvas = new Canvas(result);
        //using (var canvas = new Canvas(result))
        {
            Paint paint = new Paint();
            paint.setFilterBitmap(filter);
            canvas.drawBitmap(src, m, paint);
        }
        return result;
    
    }
    

    Please correct me if i am wrong. Also comment if it worked for you.

    I am so happy i solved it, Hope it works for you All.

    For OpenGl you simply bind the bitmap created after applying upper functions

    0 讨论(0)
提交回复
热议问题