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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

1697閲覧

2つの画像の縦横の大きさがそれぞれ何倍かを、画像をd&dすることで表示するプログラムを作りたい。

Kazumori102

総合スコア45

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2019/02/16 15:00

Windows VScode MinGW C言語 エンコード:ShiftJIS

前提・実現したいこと

例えば、画像1:1200x900,画像2:2400x1800があるとして、これをd&dすると、
縦:x2 x0.5
横:x2 x0.5
という風に表示するプログラムを作りたいです。

現在、以下の流れで実行する様にしようと思っております。

プログラムに画像2つをd&d ↓ 画像のパスをMediainfoに送り、縦横のピクセル数を求めさせ、結果を何らかの方法でプログラムに返す。(いろんな形式の画像に対応するにはライブラリを色々積まねばならないようなので、既存品を流用とした。) ↓ 結果をもとに計算する ↓ 表示

そして、現在このように実装しようとしています。

C

1#include <stdio.h> 2#include <windows.h> 3int main(int argc,char *argv[]){ 4 char all-pass[8192]={};//送るコマンドの格納配列。 5 char image-pass[]={};//画像のパスの仮置き配列。テスト後はargvが担う予定…? 6 int i;//カウンタ 7 char app-pass[]={};//ここにmediainfoのパス 8 9 for(i=1;i<3;i++){//将来用のforループ。今は意味がない。 10 sprintf(all-pass,"%s %s>test%d.txt",app-pass,image-pass,i);//コマンド生成。txtに実行結果を出す。後でtxtからデータを抽出予定。 11 if ( system(all-pass) != EXIT_SUCCESS ) {//コマンド送る 12 puts("file read error"); 13 exit(EXIT_FAILURE); 14 } 15 } 16 system("pause");//d&dでやるとき、画面がすぐ消えられると困るので。 17 return 0; 18}

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

しかし、ファイルパスに日本語が混じると、ダメ文字と俗に言われているらしいエスケープシーケンスのあれこれでバグります。
UTF8BOMでやれば、ダメ文字問題解決と、PowerShellの文字化け回避を両立できると思いましたが、今度はShiftJIS時点で普通に動いた奴でもダメになりました。
如何様にすればよいでしょうかね?

もっと良い方法や、既存でそういうのがあればそれらを教えてもらえるととてもうれしいです。

他には、アプリ起動後にd&dできるようにする方法が知りたいです。
現在はアイコンにd&dするほかない状態ですので。
WinAPIはさっぱりですわい。

細かい経緯

ネットで拾った解像度が悪いコラ画像を画質のいい元画像とあわせて高画質化するためにこのプログラムの原型ができました。
手作業でMediainfoにまず画像をぶち込み、そこで表示された2枚の画像の解像度をお手製プログラムに打ち込むと、縦横の拡大倍率が表示される。
縦横わざわざ両方だしてる理由は、コラ画像が、元画像のどちらか一方の辺をトリミングしていても、対応できるようにですね。
あと、どちらの画像の大きさに合わせてもいいように、倍率は逆数も出しています。
その、手作業部分が面倒に感じたので組み込んでしまおうと思いました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

もっと簡単にはC# + XAMLで書くことですね。文字コードとWin32APIとの格闘からとりあえず逃れられます。
https://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-a1c048ae

追記

興味が湧いたのでC# + XAMLで作ってしまいました。D&DしたあとWindowをクリックしてCtrl+Cすればクリップボードに結果が入ります。

https://github.com/yumetodo/ImageSizeRateCalculator

before
after

大して長いコードでもないしMVVMパターンとかもやってないのでGithub見れば1分で理解できるとは思うのですが、一応解説。

GUIでD&Dするとこと結果表示するところは高さが3:1になるようにしてます。MinHeightは保険。

xaml

1 <Grid.RowDefinitions> 2 <RowDefinition Height="3*"/> 3 <RowDefinition Height="*" MinHeight="20"/> 4 </Grid.RowDefinitions>

PreviewDragOverイベントでファイルのD&Dのみ検知してDropイベントで非同期に画像の大きさを求める処理を書いています。非同期にしないとGUIが固まるかもしれないので非同期大事です。この辺はMSが出してるサンプルほぼそのままです
[XAML/C#] WPF におけるドラッグ アンド ドロップ (Windows フォームから WPF へ)

画像の大きさはSystem.Drawing.Image.Sizeに丸投げしています。DLLへの参照を追加しないとビルドできないですが。System.Drawing.Image.FromFileの非同期版が見つからなかったので雑にTask.Runしてますがまあ大丈夫でしょう、しらんけど。Task.WhenAll.Selectの組み合わせの使い方は
neue cc - 非同期時代のLINQ
に解説ありますね。

charp

1var sizes = await Task.WhenAll(files.Select(async fileName => await Task.Run(() => System.Drawing.Image.FromFile(fileName).Size)));

あとは結果表示の方にName="result"とidつけて

xaml

1 <TextBox Grid.Row="1" TextWrapping="Wrap" Margin="1" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="result"/>

とりあえず小数第四位までに四捨五入して適当に文字列作ってresult.Textに代入すれば表示されます。

csharp

1 result.Text 2 = $"縦: x{Math.Round(sizes[0].Height * 1.0 / sizes[1].Height, 4)} x{Math.Round(sizes[1].Height * 1.0 / sizes[0].Height, 4)}\n" 3 + $"横: x{Math.Round(sizes[0].Width * 1.0 / sizes[1].Width, 4)} x{Math.Round(sizes[1].Width * 1.0 / sizes[0].Width, 4)}";

Ctrl+Cは
3秒でわかるWPFでCtrl+C(Copy)のときになんか実行する方法
で書いた方法で拾ってます。

csharp

1 private void OnCtrlC(object sender, RoutedEventArgs e) 2 { 3 if (string.Empty != result.Text) 4 { 5 Clipboard.SetData(DataFormats.Text, result.Text); 6 } 7 }

投稿2019/02/17 06:32

編集2019/02/17 11:18
yumetodo

総合スコア5850

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

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

Kazumori102

2019/02/17 11:16

無地のC及びほんの少し++を触った程度の僕にはWindowの作り方さえほんわかしてますが、頑張って学ばさせていただきます。
yumetodo

2019/02/17 11:20

C++というかWin32APIでWindow作る苦行に比べたらWPFなんて居眠りしてもできるくらい簡単なのでいいですね!(比較対象が悪い 自分で書いたコードはわずか56+21=77行ですから。
Kazumori102

2019/02/17 11:34

御親切にありがとうございます。C# + XAMLを学ぶのに最適な本やサイトって、何でしょうかね? 余力がありましたら、自分のもう一つの質問「制作した数値入力関数をより安全高速綺麗にしたい」の方にもアドバイスしていただけると嬉しいです。
yumetodo

2019/02/17 11:52

>C# + XAMLを学ぶのに最適な本やサイトって、何でしょうかね? 自分はQiitaの記事読んだりここで質問したり(過去の質問履歴と私のGithub repoみてください)したのでなんとも・・・ https://github.com/Microsoft/WPF-Samples 公式のsampleもイマイチわかりにくいしなぁ・・・。
Kazumori102

2019/02/17 11:54

なるほど。私も頑張ります。
yumetodo

2019/02/17 12:08

ぱっと思いつくQiitaの記事は むずかしくないWPF https://qiita.com/karno/items/f30f661b40d9adec6a6d 【C#】ReactiveProperty全然分からねぇ!って人向けのFAQ集【修正済】 https://qiita.com/YSRKEN/items/5a36fb8071104a989fb8 ですかねぇ。ああ、そうそう、ReactivePropertyの作者さんのブログはわかりやすかったかな。 Reactive Extensions とか知らない人向け ReactiveProperty のはじめの使い方 https://blog.okazuki.jp/entry/2018/03/24/135318 Reactive Extensions とか知らない人向けの ReactiveProperty のはじめかた その 2 https://blog.okazuki.jp/entry/2018/07/03/210636 その他 https://blog.okazuki.jp/search?q=ReactiveProperty
guest

0

一番簡単なのはアプリの文字コードをwchar_tにすることです。WindowsならUTF-16になります。
VS使ってるなら、プロジェクトのプロパティから[全般 -> プロジェクトの規定値 -> 文字セット]を[Unicode文字セットを使用する]に設定し、main関数を以下のように変更します。

C

1int wmain(int argc, wchar_t* argv[])

これで引数をUTF-16で受け取れるようになります。
その分、charはwchar_tになりますし、一般的な関数の名前が変化します。systemなら _wsystemとなります。
その辺はMSDNとか調べながら置き換えてください。

投稿2019/02/16 15:58

toki_td

総合スコア2850

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

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

Kazumori102

2019/02/17 11:37

VS(code)の使い方の質問になってしまいますが、プロジェクトってやはりプログラムごとに作ってしまった方がいいのですかね?現在のところ大学の課題のプロジェクトと趣味のプロジェクトという大まかな分け方になっていますので。
yumetodo

2019/02/17 11:39

MinGWということはgccだと思うんですが、mingw gccのwchar_t周りはぶっ壊れているので大体動きません。そしてWindows10のいつだったか以降かつchcp 65001してない限りどんなふうにビルドしようがうまくいかないでしょう。コンソールアプリケーションの引数やら標準入出力でUnicodeを扱うには若干時代が追いつていない気がします。
Kazumori102

2019/02/17 11:42

実装の思想自体が古いって感じですかね? 友人はMinGWでなくWSL使おうぜと言ってましたがやはりそちらの方がよいでしょうか?
yumetodo

2019/02/17 11:51 編集

思想じゃなくて純粋に過去の歴史的負債と折り合いを付けるコストをこれまで払えてこなかったというだけです。 WSLを実装するにあたってそのへんの歴史的負債と向き合わざるを得なくなり、結果20年近く経ってようやくWindows10 1607でUnicodeがまともに扱えるようになる準備(まともにフォント指定できるように)ができたというわけです。 依然WSLには別の問題があり(Windowsにfork()がないため)、パフォーマンス的に私は敬遠しています、というかDual bootしてます
Kazumori102

2019/02/17 11:57

うわぁ。 やはりデュアルは強い...しかし、作業習慣的に一度消さねばならないのはアレなのでサブPC君をデュアルにしちゃおうかと思います。
toki_td

2019/02/17 13:44

おっと、MinGWでしたか、すみません見落としてました。 gccについてはあんまり詳しくないので助言できませんが、学生ならVS Community使ったらどうですか? それかWindows SDKをインストールすればVCのコンパイラ(cl)も入ってるのでそれをVS Codeから使うとか。 プロジェクトの分けかたですが、勉強用の小さいアプリばかりならまとめておいてもいいかもしれませんが、基本は作るアプリごとに分けると思います。 環境によると思いますが、VSの場合はプロジェクトをまとめて「ソリューション」が1つのVSが開ける単位になっていて、例えばEXEのプロジェクトとEXEが使用する複数のDLLのプロジェクトを合わせて1つのソリューションにする、というやり方になります。
Kazumori102

2019/03/12 14:40

tokiさん、プロジェクトの件、わかりました。 「普通のVSだと、Cだけをやるならば余計なものが多くて重い」とサイトで見てMinGW+VScode構成にしているのですが、Winアプリを本格的に作るつもりであるなら、やはりVSにした方が良いですかね?
toki_td

2019/03/12 15:12

確かにものすごい量の機能がありますが、そこまで重くはないかな。 Eclipseとかに比べたら全然ましじゃないかなと。 Linux環境でも同じ環境使いたい、とかでなければVSのほうがデバッガが強力ですし開発しやすいです。 簡単な修正ならブレーク中に変更したりもできますし。 試してみて損はしないと思いますよ(インストールに滅茶苦茶時間かかりますけど)
Kazumori102

2019/03/12 15:17

なるほど。 ほかの環境は考えていないです。デバッガ以外にお勧めな点はありますか?
toki_td

2019/03/12 16:15

まぁC言語ならエディタとコンパイラとデバッガがあれば作れますから、あとはエディタの使いやすさとか、make書かなくていい、とかなんで、そこは好みによりますね。 C#でWinアプリ作るならVSが良くできてるのでVS以外をあえて使う理由がないですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問