Perhaps this code may help you:
public Bitmap createTransPixBitmap(Bitmap bitmap, int finWid, int finHei, float angulo, float sx, float sy, float tx, float ty, Config config){ return Bitmap.createBitmap(createTransPixArray(bitmap, bitmap.getWidth(), bitmap.getHeight(), finWid, finHei, angulo, sx, sy, tx, ty), finWid, finHei, config); } public int[] createTransPixArray(Bitmap bitmap, int width, int height, int finWid, int finHei, float angulo, float sx, float sy, float tx, float ty){ float scaWid = width*sx; float scaHei = height*sy; int[] ori = new int[width*height]; bitmap.getPixels(ori, 0, width, 0, 0, width, height); bitmap.recycle(); bitmap = null; System.gc(); return transformPix(ori, width, height, scaWid, scaHei, finWid, finHei, angulo, tx, ty); } private int[] transformPix(int[] ori, int wid, int hei, float scaWid, float scaHei, int finWid, int finHei, float angulo, float tx, float ty){ int[] fin = new int[finWid*finHei]; double sin = Math.sin(Math.toRadians(angulo)); double cos = Math.cos(Math.toRadians(angulo)); int dx = (int)((scaWid-finWid)/2); int dy = (int)((scaHei-finHei)/2); for(int y = 0; y < finHei; y++){ for(int x = 0; x < finWid; x++){ int tempX = (int)Math.floor(((x+dx-((float)scaWid/2))*((float)wid/scaWid))+0.5f-tx); int tempY = (int)Math.floor(((y+dy-((float)scaHei/2))*((float)hei/scaHei))+0.5f-ty); int tempRX = (int)Math.floor(((cos*(float)tempX)+(sin*(float)tempY))+0.5f+((float)wid/2)); int tempRY = (int)Math.floor(((cos*(float)tempY)-(sin*(float)tempX))+0.5f+((float)hei/2)); if((tempRX >= 0 && tempRX < wid) && (tempRY >= 0 && tempRY < hei)) fin[x+(y*finWid)] = ori[tempRX+(tempRY*wid)]; } } ori = null; return fin; }
This function simply scales the array of colors (if you do not want additional functions):
private int[] scale(int[] ori, int wid, int hei, int finWid, int finHei){ int[] fin = new int[finWid*finHei]; for(int y = 0; y < finHei; y++){ for(int x = 0; x < finWid; x++){ int temp = (int)(x*(wid/finWid))+((int)(y*(hei/finHei))*wid); fin[x+(y*finWid)] = ori[temp]; } } return fin; }
Hope this is helpful and I’ll be happy to take some tips to improve this code.