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

How to get the display area of a picture inside a picture box?

我有 2 个问题:

  1. 如何通过缩放比例获取图片在图片框内的显示区域?
    • 示例:
      • 我有一张图片 (1000 x 1000),我的任务是 "get an area (600 x 600) of that image"。
      • 我创建了一个表单,然后是一个面板,里面有一个图片框,图片框的大小是 400 x 400,写一些代码让用户可以在框内拖动图片
      • 我将图像加载到图片框中。由于所需区域是 600 x 600,但我的盒子只有 400 x 400,所以我用 0.67 系数缩放图像。
      • 用户将select拖动图像到所需区域。
    • 我怎样才能得到那个区域(从原始图像)?
  2. 如果我允许用​​户在该图片框中缩放in/out,我该如何处理?

因为图片是按picbox缩放的,不能直接从picbox中取区域。诀窍是 un-scale 用户 select 的矩形并将其转换为原始矩形。

您需要两张图片:

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()

当用户 select 一个矩形,我们称它为 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) )

希望对您有所帮助!