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

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

ただいまの
回答率

90.51%

  • C

    4279questions

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

  • Windows

    1635questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 412

Kazumori102

score 9

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

前提・実現したいこと

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

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

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


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

#include <stdio.h>
#include <windows.h>
int main(int argc,char *argv[]){
    char all-pass[8192]={};//送るコマンドの格納配列。
    char image-pass[]={};//画像のパスの仮置き配列。テスト後はargvが担う予定…?
    int i;//カウンタ
    char app-pass[]={};//ここにmediainfoのパス

    for(i=1;i<3;i++){//将来用のforループ。今は意味がない。
        sprintf(all-pass,"%s %s>test%d.txt",app-pass,image-pass,i);//コマンド生成。txtに実行結果を出す。後でtxtからデータを抽出予定。
        if (  system(all-pass) != EXIT_SUCCESS ) {//コマンド送る
            puts("file read error");
            exit(EXIT_FAILURE);
        }
    }
    system("pause");//d&dでやるとき、画面がすぐ消えられると困るので。
    return 0;
}

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

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

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

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

細かい経緯

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

もっと簡単には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は保険。

        <Grid.RowDefinitions>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="*" MinHeight="20"/>
        </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
に解説ありますね。

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

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

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

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

                    result.Text
                        = $"縦: 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"
                        + $"横: 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)のときになんか実行する方法
で書いた方法で拾ってます。

        private void OnCtrlC(object sender, RoutedEventArgs e)
        {
            if (string.Empty != result.Text)
            {
                Clipboard.SetData(DataFormats.Text, result.Text);
            }
        }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/17 20:16

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

    キャンセル

  • 2019/02/17 20:20

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

    キャンセル

  • 2019/02/17 20:30

    https://github.com/yumetodo/ImageSizeRateCalculator/releases/tag/v1.0.0
    いちいちビルドするのも大変でしょうし、ビルト済みのを置いておきました。

    キャンセル

  • 2019/02/17 20:34

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

    キャンセル

  • 2019/02/17 20:52

    >C# + XAMLを学ぶのに最適な本やサイトって、何でしょうかね?

    自分はQiitaの記事読んだりここで質問したり(過去の質問履歴と私のGithub repoみてください)したのでなんとも・・・

    https://github.com/Microsoft/WPF-Samples

    公式のsampleもイマイチわかりにくいしなぁ・・・。

    キャンセル

  • 2019/02/17 20:54

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

    キャンセル

  • 2019/02/17 21: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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/17 20:37

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

    キャンセル

  • 2019/02/17 20:39

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

    キャンセル

  • 2019/02/17 20:42

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

    キャンセル

  • 2019/02/17 20:49 編集

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

    依然WSLには別の問題があり(Windowsにfork()がないため)、パフォーマンス的に私は敬遠しています、というかDual bootしてます

    キャンセル

  • 2019/02/17 20:57

    うわぁ。

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

    キャンセル

  • 2019/02/17 22:44

    おっと、MinGWでしたか、すみません見落としてました。
    gccについてはあんまり詳しくないので助言できませんが、学生ならVS Community使ったらどうですか?
    それかWindows SDKをインストールすればVCのコンパイラ(cl)も入ってるのでそれをVS Codeから使うとか。

    プロジェクトの分けかたですが、勉強用の小さいアプリばかりならまとめておいてもいいかもしれませんが、基本は作るアプリごとに分けると思います。
    環境によると思いますが、VSの場合はプロジェクトをまとめて「ソリューション」が1つのVSが開ける単位になっていて、例えばEXEのプロジェクトとEXEが使用する複数のDLLのプロジェクトを合わせて1つのソリューションにする、というやり方になります。

    キャンセル

  • 2019/03/12 23:40

    tokiさん、プロジェクトの件、わかりました。

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

    キャンセル

  • 2019/03/13 00:12

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

    キャンセル

  • 2019/03/13 00:17

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

    キャンセル

  • 2019/03/13 01:15

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

    キャンセル

同じタグがついた質問を見る

  • C

    4279questions

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

  • Windows

    1635questions

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

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