2012-02-03 2 views
1

저는 수학에 약하고 이미지 크기 조정 알고리즘에 문제가 있습니다. 이미지의 비율을 특정 비율로 조정하려고합니다.이미지 비율 비교의 배정도

double neededRatio = 1.6d; 
while (!AboutEqual(imageRatio, neededRatio)) 
{ 
    var cropPixels = 10; 
    //crop code 
    ... 
    imageRatio = (double)img.Width/img.Height; 
} 

public static bool AboutEqual(double x, double y) 
{ 
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15; 
    return Math.Abs(x - y) <= epsilon; 
} 

문제는 내가 실제로 AboutEqual 방법 작동하게하는자를 픽셀의 오른쪽 번호를 찾을 수없는 것입니다 (나는 그것을 here 발견). 때로는 실패하고 내가 좋아하는, 이상한 찾을 이미지가 무기한립니다 얻을, 나는 AboutEqual 방법의 내부 - 동작을 기록 시도하고 물건을 보여주는 것 :

X: 1.5249500998004 Y: 1.6 result: false 
X: 1.55600814663951 Y: 1.6 result: false 
X: 1.55600814663951 Y: 1.6 result: false 
X: 1.58835758835759 Y: 1.6 result: false 
X: 1.62208067940552 Y: 1.6 result: false 
X: 1.60084925690021 Y: 1.6 result: false 
X: 1.5796178343949 Y: 1.6 result: false 
X: 1.61388286334056 Y: 1.6 result: false 
X: 1.59219088937093 Y: 1.6 result: false 
X: 1.62749445676275 Y: 1.6 result: false 
X: 1.60532150776053 Y: 1.6 result: false 
X: 1.58314855875831 Y: 1.6 result: false 
X: 1.61904761904762 Y: 1.6 result: false 
X: 1.59637188208617 Y: 1.6 result: false 
X: 1.63341067285383 Y: 1.6 result: false 

링크 된 질문은 x와 y가 모두있는 경우 "라고 계산 된 값은 엡실론을 증가시켜야합니다. " - 어떻게해야 작도의 픽셀 수를 찾을 수 있습니까?

+0

자르기 코드의 기능은 무엇입니까? 비율을 높이려면 (또는 줄이기 위해) 긴 가장자리 (또는 짧은 가장자리)에서 픽셀을 잘라내시겠습니까? –

+0

예,'if (imageRatio> neededShape)'가 너비를 자르고, 그렇지 않으면 높이를 자릅니다. – Madd0g

+1

'1e-15'는'1.6e0'과의 크기 차이로 상당히 작습니다. "가까운"것에 대해 당신은 무엇을 찾고 있습니까? – user7116

답변

3

값을 얻기 위해 반복 할 필요가 없습니다. 원하는 비율을 제공하는 목표 값인 x을 계산하고 여분의 픽셀을 제거하십시오.

x이 너무 큰 것을 가정하면 당신은 그것을 자르려 :

// x/y should be 1.6 
double neededRatio = 1.6d; 

// so if we know y, then x should be: 
int xTarget = (int)Math.Round(y * neededRatio); 

// pixels to crop 
int pixelsToCrop = x - xTarget; 

[편집] 요점은

는,이 코드는 당신이 얻을해야합니다 x 대상을 얻는다 (비율을 필요로한다고 가정). 여전히 루프가 필요한 경우 아무 일도하지 않게됩니다.

while (x > xTarget) 
{ 
    // crop 10 pixels 
    // and do magic stuff 
} 
+0

나는 양면에서 자르고 자르기 할 때 추가적인 로직을 적용하기 때문에 내 방식으로해야한다. 루프가 있어야한다. – Madd0g

+0

@ Madd0g : 좀 더 정교하게 만들 수 있니? 어떤 부가적인 논리인가? 목표 값에 도달해야합니다. 나는 자르기 코드를 전혀 다루지 않았기 때문에,'xTarget'에 도달 할 때까지 여러 단계에서'x'를 줄이고 싶다면 왜 그렇게 할 수 없었는지 모르겠습니다. 그러나 나는 당신이 왜 그것을해야하는지 알지 못합니다. 질문을 업데이트하고, 예제 차원을 추가하고, 자르기려는 내용과 방법을 추가 할 수 있습니다. – Groo

+0

왼쪽에서 자른 픽셀의 반을 가져 가고, 오른쪽에서 절반 정도 잘라냅니다. – user7116