• ベストアンサー

imageからbyteの変換方法

画像ファイル(jpgやbmp)からByte配列に格納する事は可能なのですが image型をbyte型に格納する方法が解りません。 ファイルのときはFileStreamとBinaryReaderを使用して BinaryReader.ReadBytesで行っていたのですが 同じような間隔で変換する事は可能なのでしょうか? ご教授お願いいたします。 プログラムはVB 2005を使用しております。

noname#17894
noname#17894

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

訂正です。 >Case "BMP" >Case "JPG" にピリオドをつけておりませんでした Case ".BMP" Case ".JPG" それと追記です。 完全に等しくなるとは保障できません。 画像の読込みイメージが、画質をハイクオリティ状態で読み込まれている画像と、未指定の画像では、できあがるイメージも、情報数が全く異なります。 http://dobon.net/vb/dotnet/graphics/encoderparameters.html また標準の読込みであっても、.NETで作成したツールで保存した画像ではなく、別のアプリケーションで作成された画像であれば、それまた等しくなる保障はありません。 なので、サンプルの「l_byt1」と「l_byt2」は、必ず等しくなるというわけではありませんので、その点を踏まえて参考にしてください。 「イメージのバイト配列化」のサンプルとしてだけと捕らえてくださいね。 [わたしは.NET2002を利用しております。]

その他の回答 (1)

回答No.1

[System.IO.MemoryStream] を利用し、ファイルストリーム同様の処理で、バイト配列化が可能です。 ただ、「Image」になってしまうと、下のファイルの形式の情報がなくなってしまうので、MemoryStreamに書き込む形式を指定する必要があります。 Sub Main()   Const DEF_FILE As String = "C:\エロ画像.JPG"   'ファイルストリームからバイト配列を取得するテスト   Dim l_byt1() As Byte = Test_BinaryReader(DEF_FILE)   '一度イメージ化し、それをメモリストリームからバイト配列を取得するテスト   Dim l_byt2() As Byte = Test_Image(DEF_FILE) End Sub Function Test_BinaryReader(ByVal p_strファイル As String) As Byte()   Dim l_bytRet() As Byte   'ファイルストリームを取得する   Dim l_fsm As New IO.FileStream(p_strファイル, IO.FileMode.Open, IO.FileAccess.Read)   '-------------------------------------------   '以下より本題   '-------------------------------------------   'バイト配列変換   l_bytRet = StreamToBytes(l_fsm)   'ファイルストリームを閉じる   l_fsm.Close()   'バイト配列の返却   Return l_bytRet End Function Function Test_Image(ByVal p_strファイル As String) As Byte()   Dim l_bytRet() As Byte   'イメージを取得する   Dim l_img As Image = CType(New Bitmap(p_strファイル), Image)   '-------------------------------------------   '以下より本題   '-------------------------------------------   'メモリストリームのインスタンスを生成   Dim l_memストリーム As New IO.MemoryStream()   Dim l_形式 As Drawing.Imaging.ImageFormat   'メモリストリームに書き込む形式を判定   Select Case IO.Path.GetExtension(p_strファイル).ToUpper     Case "BMP"       l_形式 = Imaging.ImageFormat.Bmp     Case "JPG"       l_形式 = Imaging.ImageFormat.Jpeg     Case Else       MsgBox("わからん")       Return l_bytRet   End Select   'メモリストリームに書き込む   l_img.Save(l_memストリーム, l_形式)   'バイト配列変換   l_bytRet = StreamToBytes(l_memストリーム)   Return l_bytRet End Function 'ストリームからバイト配列への変換 Function StreamToBytes(ByRef p_sm As IO.Stream) As Byte()   '読込み位置を先頭にする   p_sm.Position = 0   '一気に読み込む   Dim l_br As New IO.BinaryReader(p_sm)   Dim l_bytRet() As Byte = l_br.ReadBytes(p_sm.Length)   l_br.Close()   'バイト配列の返却   Return l_bytRet End Function

noname#17894
質問者

お礼

回答ありがとうございます。 私も色々調べてたのですが、1050YENさんの書いてくれたソースの様に Image型に変換する際には形式の情報を付与する必要があるみたいですね

関連するQ&A

  • byte配列をImageに変換する

    現在Javaでネットワーク越しに画像データを送るプログラムを書いているのですが、byte配列に変換した画像データを、元の画像データに戻せなくて困っています。 もう少しプログラムよりにかくと、BufferdImageをbyte[]には変換できますが、逆ができません。 何かよい方法はないのでしょうか?お返事お待ちしております。

    • ベストアンサー
    • Java
  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

  • byteをDBに格納

    sqlserver 2008 framework3.5 SP1 C# すみません。 C#初心者です。上の情報で十分ですか? いま、データをDBに格納したく奮闘しております。 まず、格納したいものは、以下のような16進数のデータです。 「1E0015・・・」 いまはbool配列に{0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1・・・}のデータを8個ずつ int配列に{30, 0, 5,・・・}と変換して byte配列に{1E,0,15・・・}と変換しています。 bool配列からbyte配列に変換する方法はありますでしょうか? また、byte配列のDBへの格納方法も合わせてお教えいただけると助かります。 よろしくおねがいします。

  • int配列をbyte配列に変換

    MIDPアプリを作成している初心者です。 Image データを一旦端末のレコードストアに保存しておく為、 getRGB()で取得したint配列を、byte配列に変換しなくてはいけません。 ↓のように レコードストアに書き込むメソッドを書いてみました。 public void writeRecordStore( String name, Image image ) {     int width = image.getWidth();     int height = image.getHeight();     int[] pxData = new int[ width*height ];     byte[] byteData;     RecordStore rs = null;     try {         //画像をバイトデータに変換         image.getRGB( pxData, 0, width, 0, 0, width, height );         //レコードストアを開く         rs = RecordStore.openRecordStore( name, true );         //バイト配列に変換 ← ここがわからない                  //レコードの追加         rs.addRecord( byteData, 0, byteData.length );              } catch( Exception e ) {     } } int配列をbyte配列に変換する方法わかる方 ご教授の程お願いします。 また、まだコーディングに自信が無いので、文法のミスもご指摘頂けたらありがたいです。

    • ベストアンサー
    • Java
  • BYTEについて―

    BYTEについて― わからない事がいろいろと有るのですが、 【1.データの受渡しについて。】 LPBYTE型に入っている32bitのBMP画像(pixel)を BYTE*型(pbyte)に代入する場合 pbyte = (BYTE*)pixel; このコードで問題ないのでしょうか? また、用意した受け皿のサイズを超えたデータを入れた場合、 配列の末尾に\0が入って残りは切り捨てられているのでしょうか? そして、これは正常に動作するやり方なのでしょうか? 【2.LPとは?】 LPBYTEはBYTEのポインタ型と聞きますが、 BYTE*とどう用法が違うのでしょうか?(LPシリーズ全般の疑問ですが) また、LPBYTEもやはり、末尾に\0が入って管理されているのでしょうか? 【3.宣言・定義・使い方について。】 現在、 BYTE* pbyte = new BYTE[10240]; 等と書いてBYTE配列を作っているのですが、 これは宣言と同時に定義している事になるのでしょうか? そして、newしている以上、手動でdeleteしなければならないのですよね? また、これ以外の定義方法も有るのでしょうか? 質問が多岐に渡っていてすいません、 どうも普通の配列と混同しているのか、 頭の中で疑問がグルグル回ってしまっていまして; よろしくお願いします。 っ;_ _)っ

  • 大きな画像ByteデータをUDP転送したい

    VB.net2005でサーバーアプリとクライアントアプリを作って 全クライアントに一定間隔で画像を送信しようと思ってます。 クライアント側は全部取れなくてもいいので、UDPを使ってみたのですが、 送る画像をbmp.GetPixel()で取得してByte型の配列に詰めて 縦160*横120*3(RGB)分で転送する分にはOKだったのですが、 縦320*横240*3(RGB)分はNGでした。 (65535バイト以上送信するとエラーになる…UDPのデフォルトの バッファ最大値?) それでMemoryStreamとDeflateStreamと使って圧縮してみたものの 230401Byte → 222169Byte程度にしかなりませんでした。 jpgのByteデータにして送れば小さくなるのかと思ったのですが 良いやり方がわかりませんでした。 他の方法でもいいのですが、Byteデータを小さくする手段って ありますでしょうか?

  • TIFF形式のイメージをBMPに変換する方法

    VCにてTIFF(非圧縮、RGB)をメモリに展開する事ができましたが、イメージを画面に表示するためにBMP変換を行いたいと考えています。どなたか、変換アルゴリズムかサンプルプログラムなど有りませんか?

  • AcrobatSDKを使用してPDF→JPG変換

    こんにちは、Makotoと申します。現在 acrobat5.0 acrobat sdk を使用してPDFファイルをJPGに変換するプログラムを 作成しようとしているのですが、このようなプログラムを作成 された方はいないでしょうか?プログラムのイメージは Vbで変換Exeファイルを作成し、コマンドライン上で実行 できる形で作成しようと思っています。

  • ファイル変換について

    bmpファイルをjpgに変換する事は可能なのですか?どうすればいいのでしょうか?

  • String型をbyte型へ

    MACアドレス(16進数) 00:00:00:00:00:01 これが引数で指定される。 String str = args[0]; というものがありまして(String型)、 そのコロン:で分けられた数字部分のみをバイト配列に格納したいのですが、そのうまい方法がわかりません。お助けください。 byte mac_addr[0] = Byte.parseByte("0x".concat(str.substring(0,1))); なんて事もしてみましたが、NumberForamtExceptionが 表示されます。(コンパイルは出来る。) うむ、分からない。どこが悪いのだろう??? 以上

    • ベストアンサー
    • Java

専門家に質問してみよう