Question

huahi11112 on Fri, 10 Mar 2017 03:06:35


2016年11月19日にAzuleanさんに回答いただいた質問に類似しています。

動作環境はVB2010+Win7です。
A001.jpgという画像ファイルを、「プロジェクト」メニューの(プロジェクト名)のプロパティー→リソース→リソースの追加→既存のファイルの追加 という方法でリソースとして追加しています。
A001.jpgは、ソリューションエクスプローラーを表示すると、Resourceファイルに格納されています。

この状態で、次のコードを書いているのですが、

'リソースからファイルを吐き出し、C:\フォルダーにコピーする
System.IO.File.WriteAllBytes("C:\A001.jpg", My.Resources.A001)

My.Resources.A001 の箇所で エラー 1    型 'System.Drawing.Bitmap' の値を 'Byte の 1 次元配列' に変換できません。 というコンパイルエラーが出ます。
エラーを解決する方法を教えて下さい。

以前教えていただいた方法では、「リソースに既存のファイルを追加した後、その画面でそのファイルを選び、プロパティの Filetype を Text から Binary に変えてください。」というものでしたが、今回は「プロパティの Filetype」が表示されません。


よろしくお願い致します。

Sponsored



Replies

SurferOnWww on Fri, 10 Mar 2017 03:18:47


> 2016年11月19日にAzuleanさんに回答いただいた質問に類似しています。

↓ これですか?

リソースファイルの指定時に発生するコンパイルエラー
https://social.msdn.microsoft.com/Forums/ja-JP/bea3b892-4b4b-445b-8a41-9ee857bb0854?forum=netfxgeneralja

自分がかかわった過去スレッドは調べられるので、URL を調べてこの質問の一番最初に明記しておいていただけると、回答者&閲覧者が探す手間が省けます。

回答としては先のスレッドと同じになると思うのですが、今回はそれでは解決できないのですか? そのあたりの情報も書いてください。

【追伸】

自分の環境で調べてみましたが画像は先のスレッドのテキストファイルようにバイナリ形式ではリソースとして保持できないようですね。ファイルに保存するなら、Bitmap.Save メソッドを使ってみてください、

Bitmap.Save メソッド
https://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap.save(v=vs.110).aspx


huahi11112 on Fri, 10 Mar 2017 03:46:24


御回答ありがとうございます。

>回答としては先のスレッドと同じになると思うのですが、今回はそれでは解決できないのですか? そのあたりの情報も書いてください。

プロパティの Filetypeが表示されないので、変更そのものができません。

>ファイルに保存するなら、Bitmap.Save メソッドを使ってみてください、

Bitmap.Save メソッド
https://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap.save(v=vs.110).aspx

リソースを指定して保存する方法について回答されていません。

gekka on Fri, 10 Mar 2017 04:00:22


プロジェクトフォルダの\My Projet\Resources.resxをメモ帳などで開いてA001を検索し、以下のように変更修正します。
;の後ろ部分です。

<data name="A001" type="System.Resources.ResXFileRef, System.Windows.Forms">
  <value>..\Resources\A001.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
から
<data name="A001" type="System.Resources.ResXFileRef, System.Windows.Forms">
  <value>..\Resources\A001.jpg;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>

SurferOnWww on Fri, 10 Mar 2017 04:07:40


> リソースを指定して保存する方法について回答されていません。

紹介した MSDN ライブラリを読んでください。

My.Resources.A001 で画像データが Bitmap 形式で取得できるのですよね? であれば、例えば、紹介した記事の「オーバーロードの一覧」の一番下の Save(String, ImageFormat) でファイル名と画像の形式を指定してファイルとして保存できるのでは?

サンプルコードも記載されているのでよく読んでください。

ShiroYuki_Mot on Fri, 10 Mar 2017 06:01:53


gekka さま の方法が簡単ですが、一応。

        'BitmapをByte型配列(バイナリ)に変換
        Dim bmp = My.Resources.Resource1.A001
        Dim imageBytes As Byte()
        Using ms As System.IO.MemoryStream = New System.IO.MemoryStream
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp)
            ImageBytes = ms.ToArray()
            ms.Close()
        End Using

元のコードの My.Resources.A001 を imageBytes に書き換えて下さい。  きっと。

追記 My.Resources.A001 の記述は うちで試したら 上記 になりましたので、ご参考。 直して下さい。
    あっ、それから、Form ですよね。 WPF じゃないですよね。

追記2 Code 再掲 質問の対応(完全版)

        'BitmapをResourcesから取得
        Dim bmp As System.Drawing.Bitmap = My.Resources.A001
        'Bitmapをjpgファイルに保存
        Dim fn As String = "A001copy.jpg"   'File Name with Full Path
        bmp.Save(fn, System.Drawing.Imaging.ImageFormat.Jpeg)


huahi11112 on Fri, 10 Mar 2017 07:31:42


ShiroYuki_Motさん、御回答ありがとうございます。
gekkaさんの方法を試しましたが、コンパイルエラーが消えません。
SurferOnWwwさんの提示されたリンクを何度も読んでいますが、リソースの指定方法については、記述が見つからず、全くわかりません。私のレベルはこの程度だと思って下さい。

開発はWPFなので御回答いただいたコードは(理解不能なので)読んでいませんが

 My.Resources.A001.Save("C:\A001.jpg")

これで保存できましたので、自己解決です。


ShiroYuki_Mot on Fri, 10 Mar 2017 08:21:52


一番、的外れの私の投稿が回答になってしまったので、補足します。

結局、SurferOnWww さまのお示しになった方法で解決した事になります。
エラーメッセージにもある様に、My.Resources.A001 が bitmap です。
ご説明の リソースをビットマップで取得出来ているなら はそう言う事です。
リソースの事は忘れて、データの型がなんであるかに着目すれば、答えが導かれたと思います。

私のコードは、単に、エラーの内容から、Bitmap を Byte() にする 回りくどい 記述になってしまっています。

SurferOnWww on Fri, 10 Mar 2017 16:16:29


> これで保存できましたので、自己解決です。

回答になってないレスを回答としてマークし、解決になってない自分の書き込みを自己解決とするとは、いくら知識がないといえど回答者・閲覧者に大変失礼な話と思いますよ。

.jpg ではなくて .png として保存されてませんか。

Azulean on Sat, 11 Mar 2017 01:03:07


開発はWPFなので御回答いただいたコードは(理解不能なので)読んでいませんが

Resources の Bitmap は WPF だろうと、Windows Forms だろうと、System.Drawing.Bitmap という同じ存在なので、「WPF だから読んでいません」は結果からすると、判断ミスになっていますよ。

ShiroYuki_Mot on Sat, 11 Mar 2017 05:14:36


WPF との事なので。

そもそも方向が間違っていませんか?。
WPF で System.Drawing.Imaging を持ち出す(扱う)事に疑問を持っています。
ですから、最初の投稿時に、敢えて、Form ですよね とお聞きしました。
リソースの扱い方は別の道がある気がします。
私なら、何かフォルダをプロジェクトに設けてファイルをそこにドラッグして、扱います。
https://msdn.microsoft.com/ja-jp/library/aa970494(v=vs.110).aspx

リソースからファイル化するなら、
ご質問文の様に扱わなくとも、コンテンツとして配置して、単にファイルコピーで済みませんか?。

WPF のリソースの扱い方は、 WPF 画像 リソース 等で検索すれば、色々ヒットすると思います。
但し、Form での情報が紛れ込むので、見極めも肝要です。

(的外れなのに、と書いた後に、叩かれるのは、気持ち良くないです。)

SurferOnWww on Sun, 12 Mar 2017 09:24:37


ShiroYuki_Mot さん>

>(的外れなのに、と書いた後に、叩かれるのは、気持ち良くないです。)

それは私のレスの、

> 回答になってないレスを回答としてマークし・・・

のことを言ってますか? であれば、ShiroYuki_Mot さんを叩いたつもりはないのですが、そう思われたのならすみません。

それは、読んでもいない(質問者さんの言)という ShiroYuki_Mot さんのレスに回答としてマークを付けた質問者さんへの抗議です。

ただし、質問者さんのやりたいこと、

> 'リソースからファイルを吐き出し、C:\フォルダーにコピーする
> System.IO.File.WriteAllBytes("C:\A001.jpg", My.Resources.A001)

(即ち、Bitmap 形式で取得できるリソースの画像を jpeg 形式で A001.jpg という名前を付けてファイルとして保存・・・と理解)に対する回答にはなっていないと思いますので、後で検索などでこのスレッドにたどり着いた人が、最初の質問と回答としてマークがついているレスだけ見て混乱しないよう、回答としてマークがついているレスに、質問者さんのやりたいことを実現できるコードを追記していただければと思います。


ShiroYuki_Mot on Mon, 13 Mar 2017 03:05:34


SurferOnWww さま 読みました。

補足ありがとうございます。

ご指摘の Code を 追記2 Code 再掲 として追記しました。 ご確認下さい。 合ってますよね。

SurferOnWww on Mon, 13 Mar 2017 03:29:09


追記をありがとうございました。

合っていると思います。(質問者さんがどう考えるかは分かりませんが、目的は果たせますし私の考えとも同じです)