Android – как получить край изображения x / y позиция внутри изображения

Если у меня есть ImageView, который заполняет экран.
Фон ImageView установлен в зеленый цвет.
Я размещаю растровое изображение в ImageView, сохраняя пропорции растровых изображений.

Портретная фотография в этом макете будет отображаться зеленым на левой и правой стороне
(Ориентация телефона = портрет).

Теперь, как получить левую сторону x / y позиции края, когда заканчиваются зеленые и растровые изображения.

Фон для этого проекта – это то, что я хочу написать текст на изображении и сохранить изображение обратно на новое изображение с текстом. Проблема в..

Поскольку я масштабирую изображение вSampleSize = 4; И ImageView сжимает его еще больше, сохраняя этот новый снимок, даст небольшое небольшое изображение размером 250х350.

Я хочу использовать позиции x / y и перенести написанный текст в исходное изображение inSampleSize = 4 или на изображение SDd 1500×3000

Я знаю и читаю другие вопросы об этом, что я должен «делать математические вычисления» сам, мне просто нужен этот небольшой ответ.

Я забыл, что могу сделать снимок экрана, чтобы прояснить.

Это то, на что это похоже: (Я получаю новое перо при нажатии кнопки «перо», каждое перо удерживает свой собственный уникальный текст и положение на экране

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

Вот изображение

import java.util.HashMap; import java.util.UUID; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Environment; import android.util.AttributeSet; import android.view.Display; import android.view.MotionEvent; import android.widget.EditText; import android.widget.ImageView; public class DrawView2 extends ImageView { private HashMap<String, ColorBall2> HashBall ; private String balID = ""; // variable to know what ball is being dragged public final String PTPPSERVICE_DERECTORY = "/PTPPservice/"; private Bitmap bitmap; private EditText ed; private Paint paint = new Paint(); private Paint paint2 = new Paint(); private Paint pTouch = new Paint(); private EditText addtext; private Context ctx; private String imagePath; private boolean removeBall = false; int viewWidth = 0; int viewHeight = 0; double bitmapHight =0; double bitmapWidth =0; double ratio =0; double startX = 0; double endX= 0; double startY= 0; double endY = 0; public DrawView2(Context context, AttributeSet atts,String image1) { super(context, atts); this.ctx = context; this.imagePath = image1; setFocusable(true); paint.setStyle(Paint.Style.FILL_AND_STROKE); paint.setColor(Color.BLACK); paint.setTypeface(Typeface.DEFAULT_BOLD); paint2.setStyle(Paint.Style.FILL_AND_STROKE); paint2.setColor(Color.RED); addtext = (EditText) ((Activity) ctx).findViewById(R.id.edittextaddtext); String filePath = Environment.getExternalStorageDirectory().toString() + imagePath; BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; bitmap = BitmapFactory.decodeFile(filePath,options); // SAVE RATIO int x = bitmap.getWidth(); int y = bitmap.getHeight(); if(y>x) ratio = ((double)y)/x; if(x>y) ratio = ((double)x)/y; if(y==x) ratio = 1; Drawable bit = new BitmapDrawable(bitmap); setImageDrawable(bit); } public double getRatio() { return ratio; } public HashMap<String, ColorBall2> getHashBall() { return HashBall; } // RETURN THE ON SCREEN RESIZED BITMAP public double getOnScreenBitmapHight(){ return bitmapHight; } public double getOnScreenBitmapWidth(){ return bitmapWidth; } // BITMAP SIZE public int getBitmapHight(){ return bitmap.getHeight(); } public int getBitmapWidth(){ return bitmap.getWidth(); } // GET IMAGEVIEW HIGHT WIDTH public int getViewWidth() { return viewWidth; } public int getViewHeight() { return viewHeight; } // START END XY public double getStartX() { return startX; } public double getEndX() { return endX; } public double getStartY() { return startY; } public double getEndY() { return endY; } // SET BALL TEXT public void addTextToBall(String text) { if(balID != "") HashBall.get(balID).setText(text); } // PATH public String getImagePath() { return imagePath; } // THE ORIGINAL INSAMPELSIZE=4 BITMAP public Bitmap getBitmap() { return bitmap; } // STOP DRAWAING THE BALL public void removeBall(boolean value) { removeBall = value; } // THE RECT THAT RETURN WRONG VALUE public Rect getRect(){ Rect r = getDrawable().copyBounds(); int drawLeft = r.left; int drawTop = r.top; int drawRight = r.right; int drawBottom = r.bottom; return r; } @Override protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld){ super.onSizeChanged(xNew, yNew, xOld, yOld); viewWidth = xNew; viewHeight = yNew; } public void addBall(){ // HERE I TRY TO CALCULATE THE BOUNDS LEFT,RIGHT,TOP AND BOTTOM EDGE OF THE BITMAP //NOT GOING THAT GOOD if(HashBall == null) HashBall = new HashMap<String,ColorBall2>(); //X double drawAbleWidth = viewWidth/ratio; startX = (viewWidth-drawAbleWidth)/2; double drawAbleHight = viewHeight/ratio; startY = drawAbleHight/2; int ballY = (viewHeight/2); int ballX = (viewWidth/2); Point point1 = new Point(); point1.x = (int) ballX; point1.y = (int) ballY; String uuId = UUID.randomUUID().toString(); HashBall.put(uuId,(new ColorBall2(ctx,R.drawable.pen1, point1,uuId))); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //canvas.drawCircle(10,10,10,null); if(!removeBall && HashBall != null){ for (String key : HashBall.keySet()) { //System.out.println("Key: " + key + ", Value: " + map.get(key)); if(addtext!=null) //canvas.drawCircle(HashBall.get(key).getX(), HashBall.get(key).getY(), 10, paint2); canvas.drawBitmap(HashBall.get(key).getBitmap(), HashBall.get(key).getX()-10, HashBall.get(key).getY()-80, null); canvas.drawText (HashBall.get(key).getText() + " X="+HashBall.get(key).getX() + " Y="+HashBall.get(key).getY() , HashBall.get(key).getX(), HashBall.get(key).getY(), paint); } } } // events when touching the screen @Override public boolean onTouchEvent(MotionEvent event) { int eventaction = event.getAction(); int X = (int)event.getX(); int Y = (int)event.getY(); switch (eventaction ) { case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball balID = ""; for (String key : HashBall.keySet()) { // check if inside the bounds of the ball (circle) // get the center for the ball int centerX = HashBall.get(key).getX() + 15; int centerY = HashBall.get(key).getY() + 15; // calculate the radius from the touch to the center of the ball double radCircle = Math.sqrt( (((centerX-X)*(centerX-X)) + (centerY-Y)*(centerY-Y))); // if the radius is smaller then 23 (radius of a ball is 22), then it must be on the ball if (radCircle < 33){ balID = HashBall.get(key).getID(); addtext.setText(HashBall.get(key).getText()); break; } } break; case MotionEvent.ACTION_MOVE: // touch drag with the ball // move the balls the same as the finger if (balID != "") { HashBall.get(balID).setX(X-25); HashBall.get(balID).setY(Y-25); } break; case MotionEvent.ACTION_UP: // touch drop - just do things here after dropping break; } // redraw the canvas invalidate(); return true; } } 

Solutions Collecting From Web of "Android – как получить край изображения x / y позиция внутри изображения"

Если вы знаете коэффициенты, вы можете просто получить ширину поля, которое будет помещено в сторону изображения.

 // These holds the ratios for the ImageView and the bitmap double bitmapRatio = ((double)bitmap.getWidth())/bitmap.getHeight() double imageViewRatio = ((double)imageView.getWidth())/imageView.getHeight() 

Теперь, если bitmapRatio больше, чем imageViewRatio, вы знаете, что это означает, что битмап шире, чем изображение, если они имеют равную высоту. Другими словами, у вас будут пробелы сверху и снизу.

И наоборот, если bitmapRatio меньше, чем imageViewRatio, тогда у вас будут пробелы слева и справа. Из этого вы можете получить одну из координат довольно тривиально, так как это будет 0!

 if(bitmapRatio > imageViewRatio) { drawLeft = 0; } else { drawTop = 0; } 

Чтобы получить другую координату, подумайте о втором случае, когда у вас есть место слева и справа. Здесь высоты растрового изображения и imageView равны, и, следовательно, соотношение между ширинами равно отношению между отношениями. Вы можете использовать это, чтобы определить ширину растрового изображения, как вы знаете ширину изображения. Аналогичным образом вы можете определить высоты, если ширина равна, за исключением того, что вы должны использовать обратное отношение между отношениями, поскольку ширина обратно пропорциональна соотношению:

 if(bitmapRatio > imageViewRatio) { drawLeft = 0; drawHeight = (imageViewRatio/bitmapRatio) * imageView.getHeight(); } else { drawTop = 0; drawWidth = (bitmapRatio/imageViewRatio) * imageView.getWidth(); } 

Когда у вас есть ширина или высота растрового изображения, простое пространство в стороне, это всего лишь половина разницы между шириной и высотой растрового изображения и изображения:

 if(bitmapRatio > imageViewRatio) { drawLeft = 0; drawHeight = (imageViewRatio/bitmapRatio) * imageView.getHeight(); drawTop = (imageView.getHeight() - drawHeight)/2; } else { drawTop = 0; drawWidth = (bitmapRatio/imageViewRatio) * imageView.getWidth(); drawLeft = (imageView.getWidth() - drawWidth)/2; } 

Вот способ, которым я хотел бы поделиться, он вернет смещение растрового изображения внутри imageView с помощью getImageMatrix

 public static int[] getBitmapOffset(ImageView img, Boolean includeLayout) { int[] offset = new int[2]; float[] values = new float[9]; Matrix m = img.getImageMatrix(); m.getValues(values); offset[0] = (int) values[5]; offset[1] = (int) values[2]; if (includeLayout) { ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) img.getLayoutParams(); int paddingTop = (int) (img.getPaddingTop() ); int paddingLeft = (int) (img.getPaddingLeft() ); offset[0] += paddingTop + lp.topMargin; offset[1] += paddingLeft + lp.leftMargin; } return offset; } 

Вы должны иметь возможность получить координаты (x, y) для рисования внутри, если это то, что вы ищете. Попробуй это:

 ImageView img = (ImageView)findViewById(R.id.img); Rect r = img.getDrawable().getBounds(); int drawLeft = r.left; int drawTop = r.top; int drawRight = r.right; int drawBottom = r.bottom; 

drawLeft – ваше значение X.

drawTop – ваше значение Y.

Если бы у меня была проблема с этим, оказалось бы довольно просто 🙂

float points[] = {bitmap.getWidth()/2,bitmap.getHeight()/2}; matrix.mapPoints(points); matrix.postScale(scale, scale, points[0], points[1]);