public void DrawRectangle(Pen pen, int x1, int y1, int w, int h) { APaint.Color = pen.Color.AColor(); APaint.Flags = (Android.Graphics.PaintFlags) 0; APaint.Flags = Flags; APaint.SetStyle(Android.Graphics.Paint.Style.Stroke); APaint.StrokeWidth = LineWidth; ACanvas.DrawRect(x1, y1, x1 + w, y1 + h, APaint); }
public void SurfaceCreated(ISurfaceHolder holder) { this.holder = holder; //畫筆定義 Android.Graphics.Paint mpaint = new Android.Graphics.Paint(); mpaint.Color = Android.Graphics.Color.Yellow; mpaint.SetStyle(Android.Graphics.Paint.Style.Stroke); mpaint.StrokeWidth = 4f; //畫布 Android.Graphics.Canvas canvas = holder.LockCanvas(); //清除畫布用 canvas.DrawColor(Android.Graphics.Color.Transparent, Android.Graphics.PorterDuff.Mode.Clear); // 畫布長寬 var w = sv_rec.Width; var h = sv_rec.Height; //控制正方形位置 Android.Graphics.Rect r = new Android.Graphics.Rect((int)w / 16, (int)h / 8, (int)w / 16 + 7 * w / 8, (int)h / 8 + h / 2); //canvas.DrawRect(r, mpaint); //正方形 //左下框 canvas.DrawRect(r.Left - 2, r.Bottom, r.Left + 50, r.Bottom + 2, mpaint); canvas.DrawRect(r.Left - 2, r.Bottom - 50, r.Left, r.Bottom, mpaint); //左上框 canvas.DrawRect(r.Left - 2, r.Top - 2, r.Left + 50, r.Top, mpaint); canvas.DrawRect(r.Left - 2, r.Top, r.Left, r.Top + 50, mpaint); //右上框 canvas.DrawRect(r.Right - 50, r.Top - 2, r.Right + 2, r.Top, mpaint); canvas.DrawRect(r.Right, r.Top, r.Right + 2, r.Top + 50, mpaint); //右下框 canvas.DrawRect(r.Right - 50, r.Bottom, r.Right + 2, r.Bottom + 2, mpaint); canvas.DrawRect(r.Right, r.Bottom - 50, r.Right + 2, r.Bottom, mpaint); holder.UnlockCanvasAndPost(canvas); }
public override Carto.Graphics.Bitmap OnDrawPopup(PopupDrawInfo popupDrawInfo) { PopupStyle style = popupDrawInfo.Popup.Style; // Calculate scaled dimensions float DPToPX = popupDrawInfo.DPToPX; float PXTODP = 1 / DPToPX; if (style.ScaleWithDPI) { DPToPX = 1; } else { PXTODP = 1; } float screenWidth = popupDrawInfo.ScreenBounds.GetWidth() * PXTODP; float screenHeight = popupDrawInfo.ScreenBounds.GetHeight() * PXTODP; // Update sizes based on scale (uses extension method, cf. Shared/Extensions int fontSize = FontSize.Update(DPToPX); int triangleWidth = TriangleSize.Update(DPToPX); int triangleHeight = TriangleSize.Update(DPToPX); int strokeWidth = StrokeWidth.Update(DPToPX); int screenPadding = ScreenPadding.Update(DPToPX); // Set font var font = Android.Graphics.Typeface.Create("HelveticaNeue-Light", Android.Graphics.TypefaceStyle.Normal); // Calculate the maximum popup size, adjust with dpi int maxPopupWidth = (int)(Math.Min(screenWidth, screenHeight)); float halfStrokeWidth = strokeWidth * 0.5f; int maxTextWidth = maxPopupWidth - (2 * screenPadding + strokeWidth); // Measure text TextPaint textPaint = new TextPaint { Color = TextColor, TextSize = fontSize }; textPaint.SetTypeface(font); var textLayout = new StaticLayout(text, textPaint, maxTextWidth, Layout.Alignment.AlignNormal, 1, 0, false); int textX = (int)Math.Min(textPaint.MeasureText(text), textLayout.Width); int textY = textLayout.Height; int popupWidth = textX + (2 * PopupPadding + strokeWidth + triangleWidth); int popupHeight = textY + (2 * PopupPadding + strokeWidth); var bitmap = Android.Graphics.Bitmap.CreateBitmap(popupWidth, popupHeight, Android.Graphics.Bitmap.Config.Argb8888); var canvas = new Android.Graphics.Canvas(bitmap); var trianglePath = new Android.Graphics.Path(); trianglePath.MoveTo(triangleWidth, 0); trianglePath.LineTo(halfStrokeWidth, triangleHeight * 0.5f); trianglePath.LineTo(triangleWidth, triangleHeight); trianglePath.Close(); int triangleOffsetX = 0; int triangleOffsetY = (popupHeight - triangleHeight) / 2; // Create paint object var paint = new Android.Graphics.Paint(); paint.AntiAlias = true; paint.SetStyle(Android.Graphics.Paint.Style.Stroke); paint.StrokeWidth = strokeWidth; paint.Color = StrokeColor; // Stroke background var background = new Android.Graphics.RectF(); background.Left = triangleWidth; background.Top = halfStrokeWidth; background.Right = popupWidth - strokeWidth; background.Bottom = popupHeight - strokeWidth; canvas.DrawRect(background, paint); // Stroke triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); // Fill background paint.SetStyle(Android.Graphics.Paint.Style.Fill); paint.Color = BackgroundColor; canvas.DrawRect(background, paint); // Fill triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); if (textLayout != null) { // Draw text canvas.Save(); canvas.Translate(halfStrokeWidth + triangleWidth + PopupPadding, halfStrokeWidth + PopupPadding); textLayout.Draw(canvas); canvas.Restore(); } return(BitmapUtils.CreateBitmapFromAndroidBitmap(bitmap)); }
public override Carto.Graphics.Bitmap OnDrawPopup(PopupDrawInfo popupDrawInfo) { PopupStyle style = popupDrawInfo.Popup.Style; // Calculate scaled dimensions float DPToPX = popupDrawInfo.DPToPX; float PXTODP = 1 / DPToPX; if (style.ScaleWithDPI) { DPToPX = 1; } else { PXTODP = 1; } float screenWidth = popupDrawInfo.ScreenBounds.GetWidth() * PXTODP; float screenHeight = popupDrawInfo.ScreenBounds.GetHeight() * PXTODP; // Update sizes based on scale (uses extension method, cf. Shared/Extensions int fontSize = FontSize.Update(DPToPX); int triangleWidth = TriangleSize.Update(DPToPX); int triangleHeight = TriangleSize.Update(DPToPX); int strokeWidth = StrokeWidth.Update(DPToPX); int screenPadding = ScreenPadding.Update(DPToPX); // Set font var font = Android.Graphics.Typeface.Create("HelveticaNeue-Light", Android.Graphics.TypefaceStyle.Normal); // Calculate the maximum popup size, adjust with dpi int maxPopupWidth = (int)(Math.Min(screenWidth, screenHeight)); float halfStrokeWidth = strokeWidth * 0.5f; int maxTextWidth = maxPopupWidth - (2 * screenPadding + strokeWidth); // Measure text TextPaint textPaint = new TextPaint { Color = TextColor, TextSize = fontSize }; textPaint.SetTypeface(font); var textLayout = new StaticLayout(text, textPaint, maxTextWidth, Layout.Alignment.AlignNormal, 1, 0, false); int textX = (int)Math.Min(textPaint.MeasureText(text), textLayout.Width); int textY = textLayout.Height; int popupWidth = textX + (2 * PopupPadding + strokeWidth + triangleWidth); int popupHeight = textY + (2 * PopupPadding + strokeWidth); var bitmap = Android.Graphics.Bitmap.CreateBitmap(popupWidth, popupHeight, Android.Graphics.Bitmap.Config.Argb8888); var canvas = new Android.Graphics.Canvas(bitmap); var trianglePath = new Android.Graphics.Path(); trianglePath.MoveTo(triangleWidth, 0); trianglePath.LineTo(halfStrokeWidth, triangleHeight * 0.5f); trianglePath.LineTo(triangleWidth, triangleHeight); trianglePath.Close(); int triangleOffsetX = 0; int triangleOffsetY = (popupHeight - triangleHeight) / 2; // Create paint object var paint = new Android.Graphics.Paint(); paint.AntiAlias = true; paint.SetStyle(Android.Graphics.Paint.Style.Stroke); paint.StrokeWidth = strokeWidth; paint.Color = StrokeColor; // Stroke background var background = new Android.Graphics.RectF(); background.Left = triangleWidth; background.Top = halfStrokeWidth; background.Right = popupWidth - strokeWidth; background.Bottom = popupHeight - strokeWidth; canvas.DrawRect(background, paint); // Stroke triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); // Fill background paint.SetStyle(Android.Graphics.Paint.Style.Fill); paint.Color = BackgroundColor; canvas.DrawRect(background, paint); // Fill triangle canvas.Save(); canvas.Translate(triangleOffsetX, triangleOffsetY); canvas.DrawPath(trianglePath, paint); canvas.Restore(); if (textLayout != null) { // Draw text canvas.Save(); canvas.Translate(halfStrokeWidth + triangleWidth + PopupPadding, halfStrokeWidth + PopupPadding); textLayout.Draw(canvas); canvas.Restore(); } return BitmapUtils.CreateBitmapFromAndroidBitmap(bitmap); }
protected override void DoDraw(Android.Graphics.Canvas canvas, Android.Graphics.Paint paint) { canvas.DrawRect(Bounds, paint); }
/// <summary> /// Get OCR text and draw lines on original photo /// </summary> /// <param name="imageBytes"></param> /// <param name="threshhold"></param> private async void PerformOCR(byte[] imageBytes, double threshhold) { if (_api.Initialized) { string resultText = ""; var result = await _api.SetImage(imageBytes); if (result) { resultText = _api.Text; bitmapWithBoxes = bitmap.Copy(bitmap.GetConfig(), true); Android.Graphics.Canvas canvas = new Android.Graphics.Canvas(bitmapWithBoxes); Android.Graphics.Color color = Android.Graphics.Color.IndianRed; Android.Graphics.Paint paint = new Android.Graphics.Paint(); paint.SetStyle(Android.Graphics.Paint.Style.Stroke); paint.StrokeWidth = 2; foreach (Tesseract.Result r in _api.Results(Tesseract.PageIteratorLevel.Textline)) { if (r.Confidence > 50) { paint.Color = Android.Graphics.Color.GreenYellow; } else if (r.Confidence > 10) { paint.Color = Android.Graphics.Color.DarkOrange; } else { paint.Color = Android.Graphics.Color.DarkRed; } canvas.DrawRect(r.Box.X, r.Box.Y, r.Box.X + r.Box.Width, r.Box.Y + r.Box.Height, paint); } canvas.Dispose(); Android.Util.Log.Info("tesseract result", resultText); PostProcessing pp = new PostProcessing(); pp.ProcessString(resultText); _data = pp.processedList; } } else { Toast.MakeText(this, "OCR not initialized.", ToastLength.Long).Show(); } }