質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

1回答

1932閲覧

WMFのファイルサイズを変えずにリサイズしたい

xail2222

総合スコア1497

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

リサイズ

コントロール、ウィンドウ、フォームやスクリーンのサイズ変更を指します。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2021/05/04 08:56

編集2021/05/04 23:20

前提・実現したいこと

WMFのファイルサイズを変えずにリサイズしたい。

発生している問題・エラーメッセージ

リサイズするとファイルサイズが2倍近くなる
大きくならないやり方があれば教えてください。
他の言語でも構いません。
ツールがあるなら、その紹介でも良いので教えてください。

該当のソースコード

VisualBasicとなってるけど、VisualBasic.Netです。

VisualBasic

1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 Dim gra As Graphics = CreateGraphics() 3 Dim ipHdc As IntPtr = gra.GetHdc() 4 5 Dim FileName As String = "変換前.wmf" 6 Dim FileName2 As String = "変換後.wmf" 7 8 ' 元ファイル読み込み 9 Dim metafile As Metafile 10 Dim sr As Stream = New FileStream(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read) 11 metafile = New Metafile(sr) 12 sr.Dispose() 13 14 ' 貼り付け先作成 15 Dim metafile2 As Metafile 16 metafile2 = New Metafile(FileName2, ipHdc, New Rectangle(0, 0, metafile.Width / 2, metafile.Height / 2), MetafileFrameUnit.Pixel) 17 Dim g As Graphics = Graphics.FromImage(metafile2) 18 19 ' 貼り付け 20 g.DrawImage(metafile, New Rectangle(0, 0, metafile.Width / 2, metafile.Height / 2)) 21 22 ' 保存 23 g.Save() 24 25 ' 後処理 26 g.Dispose() 27 metafile.Dispose() 28 metafile2.Dispose() 29 30 gra.ReleaseHdc(ipHdc) 31 32 End Sub

試したこと?

[MS-EMF]: Enhanced Metafile Format
を見て
拡張メタファイルの変更の例(VB)
を参考に、.Netで実装しようとしたのだけども
APIを.Netで使う方法がまだ未熟なためだと思うのですが挫折…

それに、全ての要素に対して変更をしないといけないというのとか
色々あって、これで実装するのはとても大変そう。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2019 Version 16.9.1
Microsoft .NET Framework Version 4.8.03761

WMFファイルのサンプルは、パソコンのCドライブとかをWMFで検索したら
大抵、出てくると思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Illustratorなんかを使えば簡単にできるのかもしれませんが、無料でできないかと試行錯誤してある程度現実味がでてきたので回答として書いておきます。

[条件]

  • APIを使うのが面倒だからやりたくない
  • Illustratorを持っていない
  • 無料のツールを入れられる環境にある

Inkscapeを使ってリサイズする方法

Inkscapeをダウンロード
※僕は「Compressed archive in 7z format (64bit)」をダウンロードして解凍し、使いました。
Extensionを使用するためPythonの実行環境が必要(インストーラーなら入れるかどうか選択できるっぽい)
Command Line Option の説明

「Inkscapeのインストール(解凍)フォルダ\share\inkscape\extensions」に下記のコードをそれぞれ「zzz.inx」「zzz.py」として保存します。

XML

1<?xml version="1.0" encoding="UTF-8"?> 2<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension"> 3 <_name>ZZZ</_name> 4 <id>co.jp.test.ZZZ</id> 5 <dependency type="executable" location="extensions">zzz.py</dependency> 6 <effect> 7 <object-type>all</object-type> 8 </effect> 9 <script> 10 <command reldir="extensions" interpreter="python">zzz.py</command> 11 </script> 12</inkscape-extension>

Python

1import inkex 2from inkex.transforms import Transform 3 4class Trans(inkex.Effect): 5 def __init__(self): 6 inkex.Effect.__init__(self) 7 8 def effect(self): 9 tr = Transform([[0.5, 0.0, 0.0], [0.0, 0.5, 0.0]]) 10 selection = self.svg.selected 11 if (selection): 12 for node in selection.values(): 13 node.transform = tr * node.transform 14 else: 15 inkex.errormsg("Please select an object.") 16 17effect = Trans() 18effect.run()

※ファイル名や「_name」「id」要素の値は適当ですので、良い感じに変更してください。
※引数も設定可能かとは思うのですが、よくわからなかったので、0.5倍に縮小固定です。

以下に「aaa.wmfファイルを0.5倍に縮小してbbb.wmfとして保存」するコマンドを記述します。

CommandLine

1inkscape --batch-process --actions="select-all;co.jp.test.ZZZ;export-filename:bbb.wmf;export-do" aaa.wmf

※--actionsに「transform-scale」というのがあるが、拡大縮小できなかった。(使い方不明)

投稿2021/05/06 07:37

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xail2222

2021/05/06 07:57 編集

回答ありがとうございます。 Illustratorは使えないことはないのですが、Inkscapeで出来る方がありがたいです。 ただ、pythonは環境が2.7なのでそこがネックかもしれません。 が、pythonって共存できますよね。たぶん。なら3.9も入れることが出来るかと思います。 とりあえず、回答を参考に色々試してみたいと思います。
xail2222

2021/05/06 08:55

VM環境においてテストしました。 Windows10,Inkscape 1.0.2でとりあえずテストという事で、そのままコピぺして使用させていただきました。 結果としては、元々変換したかったファイルで試してみた所 64px*64px 5.38 KB (5,512 バイト) が 804px*804px 3.06 KB (3,136 バイト) になりました。 また、絵が消えてしまうものがあったり 確かに半分の画像になるものもありました。 またペイントで見たら縮小されているものも irfanviewで見たら、縮小されていないというものもありました。 なかなか難しいです。
Hey_CH

2021/05/06 09:06

うーむ。残念ながらダメそうですねー。 こちらで検証したのはInkscapeで適当に作ったWMFだったので、うまくいったのかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問