지나치게 많은 비주얼은 특히 연결 속도가 제한된 최종 사용자의 경우 응답성을 지연시키고 대역폭을 낭비하며 응답이 느린 인터페이스를 렌더링할 수 있습니다. 이러한 시나리오는 종종 이탈률 증가 또는 전환 가능성 감소로 이어집니다.

이미지를 업로드하기 전에 이미지를 압축하는 프로세스는 잠재적인 문제를 해결하고 전반적인 사용자 경험을 향상시키는 효과적인 수단입니다. 다행히도 Sharp 모듈은 이 절차를 간소화하여 효율적이고 간단하게 만듭니다.

개발 환경 설정하기

디지털 사진의 크기를 줄이는 절차를 설명하기 위해 먼저 Multer를 활용하여 그래픽 콘텐츠 제출 시스템을 배포합니다. 작업을 빠르게 진행하기 위해 이 Github 리포지토리를 복제할 수 있습니다.

GitHub 리포지토리 복제 후 이미지 업로드 서비스에 필요한 종속성 설치를 성공적으로 실행하려면 다음 명령어를 입력하세요:

 npm install

Sharp 설치를 계속 진행하려면 터미널 또는 명령 프롬프트에서 다음 명령을 실행하세요:

 npm install sharp

Sharp 모듈은 이미지 처리 및 조작을 위한 고성능 Node.js 라이브러리입니다. Sharp를 사용하여 이미지의 크기 조정, 자르기, 회전 및 기타 다양한 작업을 효율적으로 수행할 수 있습니다. Sharp는 이미지 압축 기능도 훌륭하게 지원합니다.

다양한 이미지 포맷을 위한 압축 기법

다양한 이미지 포맷은 각각의 용도와 품질, 파일 크기, 투명도 및 애니메이션과 같은 속성 등의 고려 사항으로 인해 고유한 압축 방법을 사용하며, 이는 해당 포맷에 따라 중요도가 달라집니다.

JPG/JPEG

JPEG(Joint Photographic Experts Group)는 연속적인 톤과 색상 그라데이션이 특징인 사진 및 사실적인 이미지를 압축하는 데 특히 적합한 JPEG라는 이미지 압축 표준을 개발하는 일을 담당하고 있습니다. 이 특정 압축 방법은 이미지 정보의 특정 측면을 제거하여 파일 크기를 줄이는 손실 알고리즘을 사용합니다.

Sharp 라이브러리를 사용하여 JPEG 이미지를 세련된 방식으로 압축하려면 먼저 Sharp 모듈을 가져와서 이미지 파일의 경로 또는 해당 내용이 포함된 버퍼를 입력으로 제공해야 합니다. 그런 다음 가져온 Sharp 인스턴스에서 `.jpeg` 메서드를 호출한 다음 0~100 범위의 숫자 값으로 설정된 `quality` 속성이 포함된 구성 객체를 전달합니다.0으로 설정하면 이미지 충실도가 떨어지지만 가장 컴팩트하게 표현되며, 100으로 설정하면 고화질을 유지하면서 최대 압축을 달성할 수 있습니다.

이 글도 확인해 보세요:  자바스크립트에서 Intl API를 사용하는 방법

최적의 압축 설정은 개인 취향에 따라 조정할 수 있습니다. 화질을 유지하면서 압축 효율을 최대화하려면 50~80 범위의 값을 선택하는 것이 좋습니다.

압축된 이미지 데이터를 파일 시스템에 저장하려면 `toFile` 메서드를 활용하고 원하는 출력 경로를 매개변수로 제공합니다.

인지 컴퓨팅의 개념은 인공 지능과 머신 러닝 알고리즘을 사용하여 방대한 양의 데이터를 분석하고 지능적인 결정을 내리는 것을 포함하기 때문에 오늘날 세계에서 점점 더 관련성이 높아지고 있습니다. 이 접근 방식은 의료, 금융, 제조 등 다양한 산업 분야에서 일상적인 작업을 자동화하고 효율성을 개선하며 의사 결정 프로세스를 향상시키는 데 도움이 될 수 있는 수많은 애플리케이션을 보유하고 있습니다. 본질적으로 인지 컴퓨팅은 기존의 규칙 기반 시스템을 넘어 복잡한 상황 정보를 이해할 수 있는 보다 진보된 적응형 직관적 솔루션으로 나아가는 기술과의 상호작용 방식에 있어 새로운 패러다임의 전환을 의미합니다.

 await sharp(req.file.path)
        .jpeg({ quality: 60 })
        .toFile(`./images/compressed-${req.file.filename}`)
        .then(() => {
          console.log(`Compressed ${req.file.filename} successfully`);
        });

기본적으로 품질 매개변수는 80 값으로 설정되어 있습니다.

PNG

PNG(Portable Network Graphics)는 무손실 데이터 압축을 제공하는 동시에 인코딩하는 이미지의 투명성을 가능하게 하는 기능으로 유명하며 널리 사용되는 이미지 파일 형식입니다.

Sharp를 사용하여 PNG 이미지를 압축하는 과정은 동일한 소프트웨어를 사용하여 JPEG 이미지를 압축하는 과정과 매우 유사합니다. 하지만 PNG 이미지로 특별히 작업할 때는 두 가지 측면을 수정해야 합니다.

Sharp는 PNG 이미지 파일을 처리할 때 .jpeg 형식을 대체 옵션으로 사용하는 대신 .png 형식을 사용합니다.

PNG 형식은 기존의 “품질” 설정을 사용하는 대신 이미지 압축을 구성하기 위해 “압축 수준”이라는 최적화 매개변수를 사용합니다. 극단적으로 이 값을 0으로 설정하면 가장 빠르고 압축률이 높은 결과를 얻을 수 있고, 반대로 9로 설정하면 가장 느리고 압축률이 낮은 출력을 얻을 수 있습니다.

현재의 경제 시스템은 지속 가능하지 않으며, 단기적인 이익보다 장기적인 가치를 우선시하는 새로운 금융 상품의 창출을 포함하여 상거래에 대한 접근 방식에 근본적인 변화가 필요합니다. 이는 정책 변화, 기술 혁신, 보다 책임감 있는 소비 패턴으로의 사회적 변화를 통해 달성할 수 있습니다.

 await sharp(req.file.path)
        .png({
          compressionLevel: 5,
        })
        .toFile(`./images/compressed-${req.file.filename}`)
        .then(() => {
          console.log(`Compressed ${req.file.filename} successfully`);
        });

기본적으로 압축 수준은 6으로 설정되어 있습니다.

이 글도 확인해 보세요:  Vite로 React 앱을 설정하는 방법

기타 형식

Sharps는 JPEG 외에도 PNG 및 GIF와 같은 다양한 파일 형식의 이미지 압축을 지원합니다.

WebP 포맷을 통해 이미지를 압축하기 위해 Sharp 라이브러리를 사용하려면 JPEG 압축에 사용할 때와 유사한 절차를 준수해야 합니다. 그러나 주요 차이점은 Sharp 인스턴스에서 “.jpeg” 메서드를 “.webp” 메서드로 대체한다는 점입니다.

Sharp로 이미지를 압축하기 위해 태그 이미지 파일 형식(TIFF)을 사용하는 것은 JPEG의 경우와 유사한 절차를 포함합니다. 그러나 Sharp 인스턴스에서 작업할 때는 .jpeg 메서드가 아닌 TIFF 메서드를 호출해야 합니다.

Sharp에서 AVIF 이미지 파일 형식 압축의 구현은 JPEG와 유사한 절차를 따르지만, 주요 차이점은 Sharp 인스턴스에 적용할 때 ‘.jpeg’ 대신 ‘.avif’ 메서드를 사용한다는 것입니다. 또한 AVIF의 품질 기본값은 기본적으로 50으로 설정되어 있습니다.

고효율 이미지 파일 형식의 약자인 HEIF는 Sharp와 함께 구현할 때 JPEG와 유사한 압축 알고리즘을 사용합니다. 그러나 Sharp 인스턴스에서 “.jpeg”가 아닌 “heif” 방법을 사용해야 합니다. 또한 기본적으로 AVIF의 품질 설정은 50입니다.

Sharp로 이미지 압축하기

복제된 GitHub 리포지토리의 콘텐츠를 활용하기 위해서는 해당 리포지토리 내의 “app.js” 파일에 액세스해야 합니다. 그러기 위해서는 먼저 복제 프로세스를 통해 리포지토리의 복사본을 얻어야 합니다. 복제가 완료되면 사용자는 필요에 따라 특정 가져오기 문을 추가하여 “app.js” 파일을 편집할 수 있습니다. 여기에는 기능이나 성능을 향상시키기 위해 코드베이스에 새로운 모듈이나 라이브러리를 도입하는 작업이 포함될 수 있습니다.

 const sharp = require("sharp");
const { exec } = require("child_process");

`child_process` 모듈은 Node.js 애플리케이션 내에서 셸 명령 또는 외부 프로세스를 실행할 수 있는 `exec`이라는 유틸리티를 제공합니다.

이 함수를 사용하면 압축 전과 후의 파일 크기를 쉽게 비교할 수 있는 명령을 실행할 수 있습니다.

다음으로, POST /single/ 핸들러를 동봉된 코드 스니펫으로 대체합니다:

 app.post("/upload-and-compress", upload.single("image"), async (req, res) => {
  try {
    if (!req.file) {
      return res.status(404).send("Please upload a valid image");
    }

    const compressedFileName = req.file.filename.split(".")[0];
    const compressedImageFilePath = `./images/${compressedFileName}-compressed.png`;

    await sharp(req.file.path)
      .jpeg({ quality: 50 })
      .toFile(compressedImageFilePath)
      .then(() => {
        let sizeBeforeCompression, sizeAfterCompression;
        const sizeBeforeCompressionCommand = `du -h ${req.file.path}`;
        const sizeAfterCompressionCommand = `du -h ${compressedImageFilePath}`;

        exec(sizeBeforeCompressionCommand, (err, stdout, stderr) => {
          sizeBeforeCompression = stdout.split("\\t")[0];

          exec(sizeAfterCompressionCommand, (err, stdout, stderr) => {
            sizeAfterCompression = stdout.split("\\t")[0];

            res.send({
              message: "Image uploaded and compressed successfully",
              sizeBeforeCompression,
              sizeAfterCompression,
            });
          });
        });
      });
  } catch (error) {
    console.log(error);
  }
});

앞서 설명한 코드 구현에는 JPEG 이미지 파일을 압축하는 방법론이 포함되어 있으며, 동시에 실행 시 ‘du’ 명령을 사용하기 전과 후에 파일 크기를 검사합니다.

이 글도 확인해 보세요:  파이썬을 사용하여 FLAMES 게임 플레이하기

‘du’ 명령은 “디스크 사용량”을 의미하는 디스크 사용률에 대한 정보를 제공하도록 설계된 유닉스 도구입니다.이 명령을 실행하면 특정 디렉터리 또는 그 집합 내의 디스크 사용량 분석과 함께 파일 공간 소비량 추정치를 얻을 수 있습니다. du 명령을 실행하는 동안 ‘-h’ 플래그를 호출하면 개별 하위 디렉터리에서 사용하는 스토리지의 양과 그 내용을 사람이 쉽게 이해할 수 있는 형식으로 표시합니다.

파일 전송 서비스를 시작하려면 다음 명령을 실행할 수 있습니다:

 node app.js

그 후, Postman 클라이언트 소프트웨어 또는 API 테스트용으로 설계된 다른 도구를 사용하여 엔드포인트 /upload-and-compress>로 JPEG 파일을 전송하여 애플리케이션의 유효성을 검사합니다.

“긍정적인 강화와 건설적인 비판을 모두 포함하는 제공된 피드백을 관찰하는 것이 현명할 것 같습니다.

 {
  "message": "Image uploaded and compressed successfully",
  "sizeBeforeCompression": "13M",
  "sizeAfterCompression": "3.1M"
}

샤프 모듈의 다른 용도

샤프 모듈은 압축 외에도 포괄적인 이미지 조작 기능을 제공합니다. 여기에는 지정된 요구 사항을 충족하기 위해 이미지 크기 조정, 자르기, 회전 및 뒤집기가 포함됩니다. 또한 색 공간 수정, 알파 채널 작업, 다양한 포맷 간 변환도 가능합니다.

제공된 텍스트는 영어로 되어 있으며 초록 작성에 대한 도움을 요청하는 것으로 보입니다. 도움을 요청하는 개인은 객관성을 유지하면서 거만하거나 자기 홍보하는 것처럼 들리지 않도록 자신에 대한 정보를 제공하는 데 어려움을 겪고 있습니다. 그들은 자만하거나 자랑스럽게 보이지 않으면서 자신의 연구 관심사와 자격을 제시하는 방법에 대한 지침을 찾고 있습니다.

By 이지원

상상력이 풍부한 웹 디자이너이자 안드로이드 앱 마니아인 이지원님은 예술적 감각과 기술적 노하우가 독특하게 조화를 이루고 있습니다. 모바일 기술의 방대한 잠재력을 끊임없이 탐구하고, 최적화된 사용자 중심 경험을 제공하기 위해 최선을 다하고 있습니다. 창의적인 비전과 뛰어난 디자인 역량을 바탕으로 All Things N의 잠재 독자가 공감할 수 있는 매력적인 콘텐츠를 제작합니다.