본문 바로가기
dev/classicAsp

이미지 비율 계산식 만들기.

by Kelvin™ 2015. 12. 31.

모든 환경에서 이미지를 최적화 해서 보여주기 위해 이미지의 사이즈를 강제로 정의하기 보다는 비율로 정의 하여 각 디바이스에 맞게 자동으로 비율을 지정해줄 필요가 있슴.


이에 이 방법을 어떻게 처리해야 하나를 고민.


먼저 공식을 엑셀로 계산.


참고자료는 위키의 이미지 비율을 검색. (  https://ko.wikipedia.org/wiki/%ED%95%B4%EC%83%81%EB%8F%84  )





위의 도표에서 이미지의 폭/1~20 까지는 나눈수를 보관하고

폭을 다시 1~20 까지 나눈수를 계산한 다음 일치하는지를 비교하면 해당 이미지의 비율을 구할 수 있슴.


반복문이 최악의 경우 20x20 = 400 번이 돌아가야 하는 문제가 있고 그에 따라 페이지 로딩에 악영향을 미칠수 있는 단점은 다음 버젼에서 보완하는 것으로 함.


이렇게 했을때 asp 함수 작성.



    Function calImageRatio(imgWidth, imgHeight)
       
        Dim ratio1, ratio2  '비율 저장 변수
        Dim tempwidth       '폭 값 계산 후 임시 저장 변수
       
        '값이 없으면 바로 리턴
        If Len(imgWidth) = 0 Or Len(imgWidth) = 0 Then
            ratio1   = "1"
            ratio2   = "1"
        End If
       
        '전달된 값이 숫자인지 파악
        If isnumeric(imgWidth) = false Or isnumeric(imgWidth) = false Then
            ratio1   = "1"
            ratio2   = "1"
        End If
       
        '폭과 높이가 동일하면 1:1이므로 굳이 계산치 않고 바로 반영함.
        If imgwidth = imgHeight Then
           ratio1 = "1"
           ratio2 = "1"
        Else
            For i = 1 To 20
                '폭을 1부터 나눔.
                tempwidth = imgwidth/i

                '비율이 계산되지 않았으면 높이를 나눈 값고 반복 비교.
                If ratio1 = "" then
                    For j = 1 To 20
                        If ratio1 = "" then
                            '계산된 값과 맞아 떨어지면 비율로 저장
                            If tempwidth = imgHeight/j Then
                                ratio1 = i
                                ratio2 = j
                            End if
                        End if
                    Next
                End If
            Next

        End If

        '계산된 비율을 리턴.
        calImageRatio = ratio1 & ":" & ratio2
       
    End Function



단점 : 속도가 느리다.. 아무래도 느릴 수 밖에. ( 관리자에서 자장할 때 이미지 비율도 함께 저장하면 굳이 이렇게 계산하지 않아도 될듯. )

          통용되는 비율과 다를 수 있다.  16:10의 비율의 경우 8:5의 비율로 표기되어 처음 보는 사람은 생소할 수 있슴.




또다른 문제가 발생.  운영에서 정확히 떨어지는 비율의 이미지를 올리면 좋겠으나 그렇지 못한 경우가 발생함.


이 경우를 어떻게 처리해야 할지를 고민.


그래서 가장 작은 차이가 나는 비율을 지정해서 처리하는 것으로 결론.


그래서 소스를 다시 개선.


Function calImageRatio(imgWidth, imgHeight)
   
    Dim ratio1, ratio2  '비율 저장 변수
    Dim tempwidth       '폭 값 계산 후 임시 저장 변수
    Dim tempresult      '폭 계산 시 가장 차이가 적게나는 비율
    Dim i, j

    tempresult = 100
   
    '값이 없으면 바로 리턴
    If Len(imgWidth) = 0 Or Len(imgWidth) = 0 Then
        ratio1   = "1"
        ratio2   = "1"
    End If
   
    '전달된 값이 숫자인지 파악
    If isnumeric(imgWidth) = false Or isnumeric(imgWidth) = false Then
        ratio1   = "1"
        ratio2   = "1"
    End If
   
    '폭과 높이가 동일하면 1:1이므로 굳이 계산치 않고 바로 반영함.
    If imgwidth = imgHeight Then
       ratio1 = "1"
       ratio2 = "1"
    Else
        For i = 1 To 20
            '폭을 1부터 나눔.
            tempwidth = imgwidth/i

            '비율이 계산되지 않았으면 높이를 나눈 값과 반복 비교.
            For j = 1 To 20
                '계산된 최소값보다 더 적은 수치가 나올 경우 최소값에 저장.
                If abs(tempwidth - imgHeight/j) < tempresult Then
                    tempresult = Abs(tempwidth - imgHeight/j)
                    ratio1 = i
                    ratio2 = j
                   
                    '0 으로 맞아 떨어지면 그대로 종료 하여 처리 속도 개선.
                    If tempresult = 0 Then
                        Exit For
                    End If
                End if
            Next
        Next

    End If

    '계산된 비율을 리턴.
    calImageRatio = ratio1 & ":" & ratio2
   
End Function




'dev > classicAsp' 카테고리의 다른 글

classic ASP JSON parser 사용기.  (0) 2015.05.19
classic asp 에서 영문이나 숫자만 넘겨받기.  (0) 2014.10.22