如何获取图片框内图片的显示区域?

时间:2016-12-15 04:10:29

标签: c# image winforms picturebox

我有两个问题:

  1. 如何使用比例因子获取图片框内图片的显示区域?
    • 实施例:
      • 我有一张图片(1000 x 1000),我的任务是“获得该图像的区域(600 x 600)”。
      • 我创建了一个表单,然后是一个带有图片框的面板,图片框大小为400 x 400,制作一些代码以允许用户在框内拖动图像
      • 我将图片加载到图片框中。由于所需面积为600 x 600,但我的盒子仅为400 x 400,因此我使用0.67因子缩放图像。
      • 用户将通过拖动图像来选择所需的区域。
    • 我如何获得该区域(来自原始图像)?
  2. 如果我允许用​​户在该图片框中放大/缩小,我该如何处理呢?

1 个答案:

答案 0 :(得分:1)

由于图像是在picbox缩放的,因此您无法直接从picbox中获取该区域。诀窍是un-scale用户选择的矩形并将其转换为原始矩形。

您需要两张图片:

Bitmap original600x600; //unscaled
Bitmap picBoxImage; //with 400x400 dimensions
表单加载时

original600x600 = new Bitmap(600, 600);
//Draw the portion of your 1000x1000 to your 600x600 image
....
....

//create the image of your pictureBox
picBoxImage= new Bitmap(400, 400);

//scale the image in picBoxImage
Graphics gr;

gr = Graphics.FromImage(picBoxImage);

gr.DrawImage(original600x600, new Rectangle(0, 0, 400, 400));

gr.Dispose();
gr = null;

pictureBox1.Image = picBoxImage; //If at any time you want to change the image of
                                 //pictureBox1, you dont't draw directly on the control
                                 //but on picBoxImage and then Invalidate()

当用户选择一个矩形时,我们将其称为rectangleSelect,在pictureBox1上,您需要将矩形的x, y, width, height转换为原始矩形,即600x600。你需要一些简单的数学:

//scaled                    unscaled             with precision
x      becomes -----------> x * (600 / 400)      (int)( (double)x * (600D / 400D) )
y      becomes -----------> y * (600 / 400)      (int)( (double)y * (600D / 400D) )
width  becomes -----------> width * (600 / 400)  (int)( (double)width * (600D / 400D) )
height becomes -----------> height * (600 / 400) (int)( (double)height * (600D / 400D) )

希望这有点帮助!