Масштабирование прямоугольника в соответствии с растровым изображением

Я пытаюсь обрезать растровое изображение. Сначала я уменьшаю исходное растровое изображение, чтобы оно поместилось внутри представления, затем я рисую прямоугольник в представлении, который пользователь может перемещать и масштабировать, чтобы обрезать изображение, так же, как вы можете сделать в Instagram, когда импортируете изображение из своей галереи. Проблема, с которой я сталкиваюсь, заключается в масштабировании прямоугольника, чтобы он соответствовал исходному масштабу растрового изображения для обрезки. Вот что происходит:

Середина квадрата – это то, каким должен быть конечный результат

введите здесь описание изображения

И что мы на самом деле получаем: введите здесь описание изображения

Я знаю, что это просто математика, но прошлой ночью я потратил несколько часов, пытаясь понять ее. Что я делаю неправильно?

Bitmap bmp;


float scalefactor = (float)this.mOriginalBitmap.getWidth() / (float)this.mBmpScaledForView.getWidth();


float dh = (this.mCropBoxRect.right - this.mCropBoxRect.left) * (scalefactor-1f);
float dv = (this.mCropBoxRect.bottom - this.mCropBoxRect.top) * (scalefactor-1f);

float l = (float)this.mCropBoxRect.left + dh/2f;
float r = (float)this.mCropBoxRect.right + dh/2f;

float t = (float)this.mCropBoxRect.top + dv/2f;
float b = (float)this.mCropBoxRect.bottom + dv/2f;

RectF scaleRec = new RectF(l, t, r, b);

bmp = Bitmap.createBitmap(this.mOriginalBitmap, (int)scaleRec.left, (int)scaleRec.top, (int)scaleRec.width(), (int)scaleRec.height());

bmp = Bitmap.createScaledBitmap(bmp, MyConsts.outputSize, MyConsts.outputSize, false);

person bwoogie    schedule 26.09.2014    source источник


Ответы (1)


Я смог заставить его работать с помощью матрицы. Ответ довольно прост, это было просто прибытие туда, что было для меня сложно.

Bitmap bmp;

//Get the scale factors for both vertical and horizontal since we're dealing with a square inside of a rectangle 
float scalefactorH = (float)mOriginalBitmap.getWidth() / (float)mBmpScaledForView.getWidth();
float scalefactorV = (float)mOriginalBitmap.getHeight() / (float)mBmpScaledForView.getHeight();

//Create a matrix and apply the scale factors
Matrix m = new Matrix();
m.postScale(scalefactorH, scalefactorV);

//Apply the matrix to a RectF
RectF crop = new RectF(mCropBoxRect);
m.mapRect(crop);

//And finally hit the bitmap with this diddy
bmp = Bitmap.createBitmap(this.mOriginalBitmap, (int)crop.left - mOffsetX, (int)crop.top - mOffsetY, (int)crop.width() - mOffsetX, (int)crop.height() - mOffsetY);
person bwoogie    schedule 27.09.2014
comment
Пожалуйста, определите, что такое mBmpScaledForView в этом. Как я понял, mOriginalBitmap — это исходное растровое изображение, а mOffsetX и mOffsetY — какое-то фиксированное значение. - person Anurag Srivastava; 02.11.2018