2013-08-31 1 views
1

JPG 및 JPG 파일로 저장하는 변환 :rmagick를 압축 및 PNG가 나는 PNG를 압축하려고

i = Image.read("http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png").first 

가 크기 799 KB입니다입니다 :

http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>e2558b0d34221d3270189320173dabc2.png PNG 640x639 640x639+0+0 DirectClass 8-bit 799kb 

내가 JPEG로 포맷을 설정하고 10 품질 (즉 매우 낮은 품질의 파일 크기가 크게 감소해야하므로) :

i.format = 'JPEG' 

i.write("itest10.png") { self.quality = 10 } 

크기는 실제로 800킬로바이트으로 증가!

=> http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>itest40.png PNG 640x639 640x639+0+0 DirectClass 8-bit 800kb 

1) 이유는 무엇입니까?

2) 크기를 < 150kb로 조정하려면 어떻게해야합니까?

감사합니다.

+0

Rmagick이 파일 확장자로 인해 형식을 다시 PNG로 변경하고 있습니다. ".jpg"확장자로 저장하십시오. –

답변

9

'.png'확장명을 사용하면 쓰기 호출시 형식이 PNG로 다시 변경됩니다.

두 가지 가능한 솔루션이 있습니다.

i = Image.read('demo.png').first 
i.format = 'JPEG' 
i.write('demo_compressed.jpg') { self.quality = 10 } 

을 이렇게 할 수없는 경우에는 형식을 설정할 수 있습니다 : 컴퓨터 시스템의 많은가에 의존하기 때문에

첫째, 가능하면 당신의 형식에 대한 일반적인 파일 확장자를 사용하는 것이 좋습니다 것 블록 쓰기로 전달하고, 상기 확장 처리 한 후이 포맷을 적용 내부 :

i = Image.read('demo.png').first 
i.write('demo_compressed.png') do 
    self.format = 'JPEG' 
    self.quality = 10 
end 

을 모두 상기의 경우, I는 예상 고압축 (낮은 품질), JPEG 형식의 이미지를 얻는다.

2

다른 답변을 시도했지만 여전히 투명성 문제가 있습니다. 이 코드는 여기에 나를 위해 잘 작동 :

img_list = Magick::ImageList.new 

img_list.read('image.png') 

img_list.new_image(img_list.first.columns, img_list.first.rows) { 

    self.background_color = "white" 

} 

imageJPG = img_list.reverse.flatten_images 

imageJPG.write("out.jpg") 

아이디어는 먼저 다음의 ImageList를 생성 그것으로 PNG 이미지를로드하고 그 후 그 목록에 새 이미지를 추가하고 흰색 자사 BG 설정됩니다. 그런 다음 목록의 순서를 반대로하고 이미지 목록을 단일 이미지로 전개하십시오. 압축을 추가하려면 위의 대답에서 self.quality를 수행하십시오.

관련 문제