SVG를 간편하게 출력한다면 Qt가 최강의 라이브러리가 아닌가?
SVG란?
SVG를 모르는 분은 별로 없다고 생각하지만, 일단 설명해 둔다.
SVG는 벡터 이미지 형식의 대표적인 형식 중 하나입니다. 종래의 래스터 형식의 화상과 비교하여 확대 축소해도 쟈기가 나오지 않기 때문에, 웹 브라우저 등의 환경에 의해 표시 사이즈가 변동하는 장소에서도 아름다운 표시를 할 수 있다.
Qt를 사용한 SVG 출력
Qt(PySide)를 사용한 SVG의 출력은 QSvgGenerator를 사용한다.
PySide로 SVG를 출력하는 간단한 샘플을 살펴보자.
#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtSvg import *
app = QApplication(sys.argv)
svg_gen = QSvgGenerator()
svg_gen.setFileName("hello.svg")
svg_gen.setSize(QSize(200, 80))
svg_gen.setViewBox(QRect(0, 0, 200, 80))
svg_gen.setTitle("hello svg")
svg_gen.setDescription("this is sample svg.")
painter = QPainter()
painter.begin(svg_gen)
rect = QRect(0, 0, 200, 80)
painter.fillRect(rect, Qt.yellow)
painter.setPen(Qt.blue)
painter.setFont(QFont("Arial", 30))
painter.drawText(rect, Qt.AlignCenter, "Hello SVG")
painter.end()
표시 결과(※SVG를 붙여넣을 수 없기 때문에 PNG로 표시)
주의점은
from PySide.QtSvg import *
로 SVG 관련 모듈을 임포트하고 있는 것만.QSvgGenerator에 SVG의 설정을 입력하는 것만으로, 후에는 QPainter를 사용해 종래대로의 묘화를 할 뿐이다.
SVG의 엘리먼트 조작 등은 일절 하고 있지 않지만, 이것만으로 SVG 파일이 작성되는 것이다.
(물론 완전한 SVG 변환이 아닌 텍스트의 wrap 등 SVG에 원래 기능은 무시된다)
덧붙여서 SVG의 묘화는 QSvgWidget, 또는 QGraphicsSvgItem에서 QGraphicsView로 표시도 할 수 있다.
QGraphicsScene의 SVG 출력(2017-01-05 추가)
QGraphicsScene에서도 SVG 출력이 가능하다.
scene = QGraphicsScene()
rect = QRect(0, 0, 200, 80)
scene.setSceneRect(rect)
scene.addRect(rect, QPen(Qt.transparent), QBrush(Qt.yellow))
text_item = scene.addText("Hello SVG", QFont("Arial", 30))
text_item.setDefaultTextColor(Qt.blue)
painter = QPainter()
painter.begin(svg_gen)
scene.render(painter)
painter.end()
QGraphicsScene을 출력할 수 있는 것은 큰, QGraphicsView에서 마우스 등으로 아이템 위치를 조정해, 그대로 SVG에 출력할 수 있는 것이다.
간편하게 SVG의 라이브 프리뷰 환경이 완성되는 것이다.
svgwrite의 이점
svgwrite는 유연하고 사용하기 쉬운 라이브러리입니다.
그러나 Qt를 사용한 경우와 비교하여 svgwrite에 대한 우위성을 꼽아 가고 싶다.
svgwrite는 getBBox가 존재하지 않는다
svgwrite는 좋든 나쁘든 XML의 래퍼적인 존재이므로, 표시시의 바운티 박스를 요구한다
getBBox
가 존재하지 않는다.이것은 텍스트를 취급할 경우, 텍스트의 크기를 모르기 때문에 매우 곤란하다.
SVG 요소에 대한 지식이 필요 없음
SVG를 출력하기 때문에, 엘리먼트에 대한 지식이 필요한 것은 당연하지만, Qt를 사용하면 엘리먼트에 대한 지식이 전혀 없어도 SVG를 출력할 수 있다.
작성 과정의 미리보기가 용이
프로그램상에서 SVG를 출력하는 경우, 트라이 & 에러가 필요하다.
Qt를 사용하면 QPainter의 드로잉이 그대로 SVG가 되기 때문에, 필연적으로 프리뷰 환경이 완성되고 있는 것이다.
SVG로 변환 후에도 QSvgWidget에서 확인할 수 있기 때문에, 프로그램만 짜 버리면 라이브 프리뷰로 수정과 작성을 동시에 실시할 수 있다.
SVG 버전 정보
Qt5가 취급할 수 있는 SVG의 버젼 1.2이다, 그러나 PySide를 사용했을 경우 Qt4.8이므로 SVG의 버젼은 1.1이므로 주의.
PySide2가 한시라도 빨리 정식 발매되는 기도뿐이다.
요약
Qt를 사용한 SVG의 출력은 매우 간단합니다.
Qt를 알고 있으면 SVG의 지식이 거의 없어도 좋은 것은 SVG 초보자에게는 큰 어드밴티지이다.
HTML5와의 제휴나 스타일 시트의 적용 등, 유연성이 있는 SVG의 작성은 svgwrite에 양보할 수밖에 없지만, 표시만의 SVG이면 Qt는 큰 선택사항이 된다.
SVG의 자동 생성 사용법
덧붙여서, 나는 C 언어의 구조체를 자동 해석해 블록도(라는 명칭일까?)를 SVG로 출력하고 있다.
BITMAPINFOHEADER 구조체는 다음과 같은 그림을 출력합니다.
Sphinx 등의 매뉴얼에 자동 생성으로 묻으면 퍼팅 등의 구조를 알 수 있기 때문에 편리하다.
Reference
이 문제에 관하여(SVG를 간편하게 출력한다면 Qt가 최강의 라이브러리가 아닌가?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/pashango2/items/b9f61ab06c78a3e2ccdd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)