1

我正在开发一个应用程序来处理在宽幅图像扫描仪上扫描的图像。这些图像显示为 aImageBrush上的 a Canvas。在此Canvas他们可以Rectangle用鼠标来定义要裁剪的区域。

我的问题是Rectangle根据原始图像大小调整大小,以便裁剪原始图像上的确切区域。

到目前为止,我已经尝试了很多事情,只是在挤压我的大脑,找出正确的解决方案。
我知道我需要获得原始图像比画布上显示的图像大的百分比。

原始图像的尺寸为:

小时:5606 瓦
:7677

当我展示图片时,它们是:

小时:1058,04 瓦
:1910

这给出了这些数字:

float percentWidth = ((originalWidth - resizedWidth) / originalWidth) * 100;
float percentHeight = ((originalHeight - resizedHeight) / originalHeight) * 100;

percentWidth = 75,12049
percentHeight = 81,12665

从这里我无法弄清楚如何Rectangle正确调整大小以适合原始图像。

我的最后一种方法是:

int newRectWidth = (int)((originalWidth * percentWidth) / 100);
int newRectHeight = (int)((originalHeight * percentHeight) / 100);
int newRectX = (int)(rectX + ((rectX * percentWidth) / 100));
int newRectY = (int)(rectY + ((rectY * percentHeight) / 100));

希望有人能引导我朝着正确的方向前进,因为我在这里偏离了轨道,我看不到我错过了什么。

解决方案

    private System.Drawing.Rectangle FitRectangleToOriginal(
        float resizedWidth,
        float resizedHeight,
        float originalWidth,
        float originalHeight,
        float rectWidth,
        float rectHeight,
        double rectX,
        double rectY)
    {
        // Calculate the ratio between original and resized image
        float ratioWidth = originalWidth / resizedWidth;
        float ratioHeight = originalHeight / resizedHeight;

        // create a new rectagle, by resizing the old values
        // by the ratio calculated above
        int newRectWidth = (int)(rectWidth * ratioWidth);
        int newRectHeight = (int)(rectHeight * ratioHeight);
        int newRectX = (int)(rectX * ratioWidth);
        int newRectY = (int)(rectY * ratioHeight);

        return new System.Drawing.Rectangle(newRectX, newRectY, newRectWidth, newRectHeight);
    }
4

2 回答 2

2

我认为唯一可靠的选择是让您的用户放大图像(100% 或更高的缩放级别)并选择图像的一部分。通过这种方式,他们可以进行精确的基于像素的选择。(假设您选择矩形的目的是选择图像的一部分。)

您现在的问题是您正在使用浮点计算,因为 75% 的缩放级别和舍入错误会使您的选择矩形不准确。无论您做什么,当您尝试在缩小的图像上进行选择时,您都没有选择精确的像素 - 您在调整矩形大小时选择了部分像素。由于无法选择部分像素,因此选择边缘将向上或向下舍入,因此您在给定方向上选择一个像素太多或一个像素太少。

我刚刚注意到的另一个问题是你扭曲了你的图像——水平是 75%,垂直是 81%。这对用户来说更加困难,因为图像在两个方向上的平滑度会有所不同。水平方向 4 个原始像素将插值在 3 个输出像素上;垂直 5 个原始像素将在 4 个输出像素上插值。

于 2012-09-27T08:42:04.250 回答
1

你实际上是在做一种投影。不要使用百分比,只需使用 5606 和 1058,4 = ~5.30 之间的比率。当用户拖动矩形时,将其重新投影为selectedWidth * 5606/1058.4.

于 2012-09-27T08:44:09.007 回答