2017-09-28 1 views
0

저는 날카로운 라이브러리를 사용하는 노드에서 이미지 조작으로 최근에 일했고 내 서비스가 새로운 이미지의 base64 인코딩을 반환하도록했습니다. 제 질문은 간단합니다 : base64로 인코딩 된 이미지는 항상 ==으로 끝나나요? 그렇지 않다면, jpeg/png를 다룰 때의 차이점은 무엇입니까? 내 이해는 인코딩 형식에 관계없이 동일해야하지만,이 날 그렇지 않으면 생각하게됩니다. 테스트 도중, 내 응답 본문 (base64 이미지)이 =으로 끝나는 지 확인하기 위해 단위 테스트를하기로 결정했습니다. 내가 발견 한 것은 sharp.max()을 사용하여 비율을 유지하면서 이미지를 자르지 않으면 테스트가 통과한다는 것입니다. 이 값을 그대로두고 원하는 높이/너비 매개 변수로 크기를 조정하면 테스트가 실패합니다. 또한이 동작은 jpeg가 아니라 png로 제한된다는 점도 주목할 가치가 있습니다.언제 base64로 인코딩 된 png 이미지가 '='로 끝나지 않습니까?

data:image/jpeg;base64,/9j/.....4qUhXQD5S5HzQhAM8KRz80IQH//2Q== 
: 여기
data:image/jpeg;base64,/9j/.....RgX7p57pbYTvawQC580N4QcJtygGGgG/SLplthgBV2KCfCgIa3wWTVA3HySPmgP//Z 

가립니다 NOT 이미지입니다 : 여기
const sharp = require('sharp'); 
const request = require('request'); 
const bufferRequest = request.defaults({ encoding: null }); 

function imgFormatter(url, args) { 
    return new Promise((resolve, reject) => { 
     bufferRequest.get(url, args, function (err, res, body) { 
     let imgFormat = url.includes('png') ? 'png' : 'jpeg'; 
     let resized = (args.crop) 
     ? sharp(body).resize(args.width, args.height) 
     : sharp(body).resize(args.width, args.height).max() 
     resized.toFormat(imgFormat) 
     .toBuffer() 
     .then((output) => { 
      let newImage = "data:" + res.headers["content-type"] + ";base64," + new Buffer(output).toString('base64'); 
      console.log(newImage); 
      resolve(newImage); 
     }) 
     .catch((error) => { 
      reject(error); 
     }) 
     }); 
    }) 
} 

가 잘린 경우처럼 파일의 끝이 보이는 것입니다 : 여기

내 크기 조정 기능입니다

예제 스 니펫에 대한 사과, 저의 base64가 너무 커서 여기에 포함 할 수 없습니다. 이미지가 좋은지 테스트하려면 https://codebeautify.org/base64-to-image-converter을 사용하고 있습니다. 올바른 크기로 예상대로 이미지를 생성 할 수 있습니다. 자른 이미지가 base64로 인코딩되는 이유는 ==으로 끝나지 않습니다. 이 유용 경우 가, 여기 내가 사용하고 날카로운 라이브러리 : 마지막에 http://sharp.dimens.io/en/stable/api-resize/#max

답변

관련 문제