연립 방정식을 사용하여 프로그램을 작성하는 이야기
지정된 프레임 (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로 다시 계산
단위
mm
와 pt
라고 비교하기 어렵다.dpi
는 dot 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 소프트웨어로 보아도 잘 계산된 것처럼 보입니다.
이미지 해상도를 내다
음, 이미지의 해상도를 내면,
dpi
는 dot 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같다.
요약
이런 식으로 연립 방정식을 푸는 느낌으로,
자신이 원하는 기능의 함수를 작성할 수 있습니다.
자신의 경우, 아무래도 원하는 함수를 (여기 여기 구그라고 해도) 발견되지 않는 경우,
게다가 할거야. 아핀 변환계라든지.
이상, 프로그램과 연립 방정식의 이야기였습니다.
Reference
이 문제에 관하여(연립 방정식을 사용하여 프로그램을 작성하는 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kanemu/items/da1cfaedaed1fa3dc1a9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)