如何增加位图的像素大小

时间:2019-08-28 07:02:43

标签: android image-processing bitmap

我想知道是否可以逐像素修改位图。我不是要更改位图的大小/比例。我要寻找的是我要增加位图的所有或某些特定像素的大小。

我尝试过

Thread(Runnable {
         val newBitmap = Bitmap.createScaledBitmap(bitmap, bitmap.width * 4,
                 bitmap.height * 4, true);

         for (x in 0 until bitmap.getWidth()) {
             for (y in 0 until bitmap.getHeight()) {

                 val pixel = bitmap.getPixel(x, y);
                 val redValue = Color.red(pixel)
                 val blueValue = Color.blue(pixel)
                 val greenValue = Color.green(pixel)

                 newBitmap.setPixel(x * 4, y * 4, Color.rgb(redValue, greenValue, blueValue))

             }
         }

         runOnUiThread({ imageView.setImageBitmap(newBitmap) })

     }).start()

但是它对位图没有影响。任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

如果只想像素化位图的一部分,则可以在要编辑的部分上创建Bitmap,对新位图进行更改,然后将更改后的位图覆盖在顶部原始位图。

例如,您可以通过执行以下几行操作来像素化Bitmap的一部分,

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    Bitmap originalBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.drawabledroid)).getBitmap();
    // Pixelate just the top half
    int x = 0, y = 0, width = originalBitmap.getWidth(), height = originalBitmap.getHeight()/2;
    //Or pixelate a rectangle in the middle
    //int x = originalBitmap.getWidth()/2 - 50, y = originalBitmap.getHeight()/2 - 50, width = 100, height = 100;

    //Get bitmap with region you want to pixelate
    Bitmap original = Bitmap.createBitmap(originalBitmap, x,y,width,height);

    int normalWidth = original.getWidth(), normalHeight = original.getHeight();
    int smallWidth = normalWidth/15, smallHeight = normalHeight/15;

    Bitmap small = getResizedBitmap(original, smallWidth, smallHeight);
    Bitmap pixelated = getResizedBitmap(small, normalWidth, normalHeight);

    //Overlay the pixelated bitmap on top of the original
    Bitmap overlayed = overlayBitmaps(originalBitmap, pixelated,x,y, width, height);
}

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    return Bitmap.createBitmap(
            bm, 0, 0, width, height, matrix, false);
}

public static Bitmap overlayBitmaps(Bitmap bmp1, Bitmap bmp2, int x, int y, int width, int height) {
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bmp1, new Matrix(), null);
    //If you know the background in transparent or any specific color
    //Then you can color the region before overlaying the pixelated bitmap
    Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setColor(Color.TRANSPARENT);
    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
    mPaint.setAntiAlias(true);
    canvas.drawRect(x,y, x+width,y+height, mPaint);
    //Overlay the pixelated bitmap
    canvas.drawBitmap(bmp2, x, y, null);
    return bmOverlay;
}
相关问题