C# 如何基于百万像素和纵横比计算分辨率

C# 如何基于百万像素和纵横比计算分辨率,c#,image,resolution,C#,Image,Resolution,我如何用C#计算基于百万像素的精确分辨率 假设我有一个5000x4000像素的图像,我想重新缩放到0.6mpx,如何获得精确的水平和垂直分辨率,以获得一个保持原始纵横比的0.6mpx图像 我有这个: int nXPixels=5000; // original image Width int nYPixels=4000; // original image Height float fRatio=5000/4000; // original image aspect ratio int

我如何用C#计算基于百万像素的精确分辨率

假设我有一个5000x4000像素的图像,我想重新缩放到0.6mpx,如何获得精确的水平和垂直分辨率,以获得一个保持原始纵横比的0.6mpx图像

我有这个:

int nXPixels=5000;  // original image Width
int nYPixels=4000;  // original image Height
float fRatio=5000/4000;    // original image aspect ratio
int nNewPixelResolution=600000; // 0.6mpx new resolution

int nNewXPixels=?
int nNewYPixels=?

百万像素的数量等于分辨率的长度和宽度除以一百万的乘积。因此,对于5000x4000像素,您将有20 Mpx。要将其重新缩放到0.6Mpx,但保持该比率,只需按20Mpx/0.6Mpx的平方根重新缩放每个维度,这样,当新计算的维度相乘时,结果将等于0.6Mpx

因此,您的计算应类似于:

ratio=sqrt(20/0.6)
newWidth=oldWidth/ratio
newHeight=oldHeight/ratio

然后,如果将
newWidth
newHeight
相乘,结果大约为0.6Mpx,或600000 px

百万像素的数量等于分辨率的长度和宽度的乘积除以一百万。因此,对于5000x4000像素,您将有20 Mpx。要将其重新缩放到0.6Mpx,但保持该比率,只需按20Mpx/0.6Mpx的平方根重新缩放每个维度,这样,当新计算的维度相乘时,结果将等于0.6Mpx

int nXPixels=5000;  // original image Width
int nYPixels=4000;  // original image Height
//float fRatio=5000/4000;    // original image aspect ratio
int nNewPixelResolution=600000; // 0.6mpx new resolution
int nOldPixelResolution=nXPixels*nYPixels;
double conv = Math.sqrt((double)nNewPixelResolution/(double)nOldPixelResolution);
int nNewXPixels= (int)Math.round(nXPixels*conv);
int nNewYPixels= (int)Math.round(nYPixels*conv);
因此,您的计算应类似于:

ratio=sqrt(20/0.6)
newWidth=oldWidth/ratio
newHeight=oldHeight/ratio

如果将
newWidth
newHeight
相乘,结果大约为0.6Mpx,或600000 px

这个问题的答案在2秒钟的谷歌搜索中找到:@durbnpoisin不是真的;这并没有提到面积(或兆像素),实际上@durbnpoisin,你的链接并没有提供答案。OP希望指定输出的百万像素(wxh的总像素数),而不是输出的宽度或高度。这个问题的答案在2秒钟的谷歌搜索中找到:@durbnpoisn不是真的;这并没有提到面积(或兆像素),实际上@durbnpoisin,你的链接并没有提供答案。OP想要指定输出百万像素(wxh的总像素数),而不是输出宽度或高度。如果是这样,那么我们只需要先将两个整数转换为(浮点)。我已经更新了代码。
conv
为0,因为他正在将新分辨率除以旧分辨率,并执行
int
除法,结果为0(因为新分辨率小于旧分辨率)。将
float
替换为
double
,并在括号内添加一个
1.0
,如下所示:
double conv=Math.Sqrt(1.0*nNewPixelResolution/nOldPixelResolution)
。这将强制除法为结果类型double,因为至少有一个数字是double)如果是这种情况,那么我们只需要首先将两个整数转换为(float)。我已经更新了代码。
conv
为0,因为他正在将新分辨率除以旧分辨率,并执行
int
除法,结果为0(因为新分辨率小于旧分辨率)。将
float
替换为
double
,并在括号内添加一个
1.0
,如下所示:
double conv=Math.Sqrt(1.0*nNewPixelResolution/nOldPixelResolution)
。这将强制除法为结果类型double,因为至少有一个数字是double)
int nXPixels=5000;  // original image Width
int nYPixels=4000;  // original image Height
//float fRatio=5000/4000;    // original image aspect ratio
int nNewPixelResolution=600000; // 0.6mpx new resolution
int nOldPixelResolution=nXPixels*nYPixels;
double conv = Math.sqrt((double)nNewPixelResolution/(double)nOldPixelResolution);
int nNewXPixels= (int)Math.round(nXPixels*conv);
int nNewYPixels= (int)Math.round(nYPixels*conv);