연립 방정식을 사용하여 프로그램을 작성하는 이야기

특정 프로그램을 작성하고,

지정된 프레임 (mm)에 지정된 해상도 (dpi)
가로폭(pt), 세로폭(pt)의 사이즈를 알고 있는 화상을 두는 경우,
해당 이미지에 필요한 해상도 (dpi)를 알고 싶습니다.

라는 것이 있었다.


이것을 계산해 주는 함수를, javascript 로 만들고 싶다.

이미지의 세로폭과 가로폭, 어느 쪽을 비교할까?



이것은 이미지 프레임과 이미지의 비율을 비교하여 플래그를 지정해야합니다.
var frameMmW = 80; // 枠ヨコ幅
var frameMmH = 60; // 枠タテ幅
var imagePtW = 142; // 画像ヨコ幅
var imagePtH = 64; // 画像タテ幅

그렇다면,
// 画像の[横/縦]が枠の[横/縦]より大きければ、横幅を使用する
var useWidth = (imagePtW / imagePtH >= frameMmW / frameMmH);

같은 느낌에 쓸 수 있다.

RunJS 을 사용해보십시오.
RunJS - A playground for JavaScript and TypeScript



시도에 이미지의 가로 폭과 세로 폭을 변경해 보면,
화상 프레임에 세로를 맞추고 싶은 사이즈로 제대로 false 된다.



mm와 pt를 inch로 다시 계산



단위 mmpt 라고 비교하기 어렵다.dpidot per inch 이므로 각각 inch 로 고친다.

72포인트 = 1인치 = 25.4밀리 그러니까…
var unitToInch = function (size, unit) {
    var perUnit = {
        'in': 1,
        'pt': 72,
        'mm': 25.4
    };
    return size / perUnit[unit];
}

var frameInW = unitToInch(frameMmW, 'mm');
var frameInH = unitToInch(frameMmH, 'mm');
var imageInW = unitToInch(imagePtW, 'pt');
var imageInH = unitToInch(imagePtH, 'pt');



Adobe 소프트웨어로 보아도 잘 계산된 것처럼 보입니다.



이미지 해상도를 내다



음, 이미지의 해상도를 내면,
dpidot per inch 그래서
ピクセル数 ÷ 幅(inch) = 解像度 (dpi)

라는 것은
枠のピクセル数 ÷ 枠のサイズ(inch) = 枠の解像度 (dpi)
画像のピクセル数 ÷ 画像のサイズ(inch) = 画像の解像度 (dpi)

그래서 2차 연립방정식의 형태가 된다.

프레임의 픽셀 수 = 이미지의 픽셀 수
되기를 원하기 때문에,
画像or枠のピクセル数 ÷ 枠のサイズ(inch) = 枠の解像度 (dpi)
画像or枠のピクセル数 ÷ 画像のサイズ(inch) = 画像の解像度 (dpi)

음, 양쪽에 사이즈를 걸어
画像or枠のピクセル数 = 枠の解像度 (dpi) × 枠のサイズ(inch)
画像or枠のピクセル数 = 画像の解像度 (dpi) × 画像のサイズ(inch)

왼쪽이 동일하기 때문에 아래를 왼쪽으로, 위를 오른쪽으로
画像の解像度 (dpi) × 画像のサイズ(inch)= 枠の解像度 (dpi) × 枠のサイズ(inch)

원하는 것은 이미지 해상도이므로 양쪽을 이미지 크기로 나누면
画像の解像度 (dpi) = 枠の解像度 (dpi) × 枠のサイズ(inch)÷ 画像のサイズ (inch)

할 수 있었다. 이것을 함수에 떨어뜨린다.
var getImageDpi = function getImageDpi(frameDpi, frameInchSize, imageInchSize) {
  return frameDpi * frameInchSize / imageInchSize;
}

어쩌면 간단한 계산?
시도해보십시오.

/**
 * 他の単位のサイズをインチに直す
 * @param {number} size - サイズ
 * @param {string} unit - 単位(in,pt,mm)
 * @return {number} - インチサイズ
 */
var unitToInch = function (size, unit) {
    var perUnit = {
        'in': 1,
        'pt': 72,
        'mm': 25.4
    };
    return size / perUnit[unit];
}

/**
 * 画像のdpiを計算する
 * @param {number} frameDpi - 枠の解像度 (dpi)
 * @param {number} frameInchSize - 枠のサイズ (inch)
 * @param {number} imageInchSize - 画像のサイズ (inch)
 * @return {number} - 画像の解像度 (dpi)
 */
var getImageDpi = function getImageDpi(frameDpi, frameInchSize, imageInchSize) {
  return frameDpi * frameInchSize / imageInchSize;
}

var frameDpi = 300; // 枠の解像度
var frameMmW = 80; // 枠ヨコ幅
var frameMmH = 60; // 枠タテ幅
var imagePtW = 142; // 画像ヨコ幅
var imagePtH = 64; // 画像タテ幅

// 幅と高さどちらを使うか
var useWidth = (imagePtW / imagePtH >= frameMmW / frameMmH);
// 枠のinchサイズ
var frameInchSize = unitToInch((useWidth? frameMmW: frameMmH), 'mm');
// 画像のinchサイズ
var imageInchSize = unitToInch((useWidth? imagePtW: imagePtH), 'pt');
// 画像の解像度
var imageDpi = getImageDpi(frameDpi,frameInchSize,imageInchSize);
console.log('imageDpi: ' + imageDpi);



약 479dpi로 나왔다.
Photoshop에서 이미지를 열고 해상도를 479dpi로 다시 샘플링



보존 후, 재샘플 없이, 폭을 80mm로 바꾸어 본다.



픽셀 수가 바뀌므로 딱 맞지는 않지만,
대체로 OK같다.

요약



이런 식으로 연립 방정식을 푸는 느낌으로,
자신이 원하는 기능의 함수를 작성할 수 있습니다.

자신의 경우, 아무래도 원하는 함수를 (여기 여기 구그라고 해도) 발견되지 않는 경우,
  • 공식 구구
  • 현재 취할 수있는 매개 변수를 공식에 적용하여 방정식을 만듭니다.
  • 원하는 매개 변수가 왼쪽에 오도록 식을 푸십시오
  • 함수에 떨어뜨림

  • 게다가 할거야. 아핀 변환계라든지.

    이상, 프로그램과 연립 방정식의 이야기였습니다.

    좋은 웹페이지 즐겨찾기