VB.netでTIFFファイルの読み込みと保存

このQ&Aのポイント
  • VB.netを使用してTIFFファイルを読み込み、保存する方法について質問です。
  • TIFFファイルの読み込みと保存の処理を実装しましたが、保存後のファイルが元のファイルと比べて容量が小さくなり、一部のソフトで読み込めなくなってしまいます。これを解決する方法を教えてください。
  • TIFFファイルを読み込んで保存するVB.netの処理で、保存後のファイル容量が小さくなり、一部のソフトで読み込めなくなる現象が発生しています。この問題を解決する方法を教えてください。
回答を見る
  • ベストアンサー

VB.netでTIFFファイルの読み込みと保存

GDI+については全くの初心者です。 フォームにボタンを貼り付け、下記のような処理を書いてみました。 単純にTIFFファイルを読み込んで、別名で保存するという 処理ですが、元のTIFF(test1.tif)と保存後のTIFFファイル(test2.tif)では、ファイル容量が、1/2位に小さくなってしまいます。また、元のファイルはPhotoshop7で読み込めるのですが、保存後のファイルは、読み込めません(ファイルにはこのバージョンのphotoshopと互換性がありませんというエラーメッセージ)。しかし、他のソフト(例えばIE)からはどちらも読み込めます。 これは、一体どういう理由で、どのようにすれば、両方とも全く同じTIFFファイルにすることができるでしょうか。なお、この処理の目的は、単にファイル名の変更をしたいというものではなく、本来は、読み込みと保存の間に、何らかの変換処理を行いたいのです。 よろしくお願いいたします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim bmp As New Bitmap("c:\test1.tif") bmp.Save("c:\test2.tif", ImageFormat.Tiff) bmp.Dispose() End Sub

  • akey
  • お礼率69% (37/53)

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

MSのHELPで TIFF (Tag Image File Format) TIFF は、さまざまなプラットフォームおよびイメージ処理アプリケーションで広くサポートされる、柔軟性と拡張性の高い形式です。TIFF ファイルは、ピクセルあたり任意のビット数を持つイメージを格納でき、さまざまな圧縮アルゴリズムを使用できます。いくつかのイメージを複数のページから成る単一の TIFF ファイルに格納できます。イメージに関連する情報 (スキャナの種類、ホスト コンピュータ、圧縮の種類、イメージの向き、ピクセルあたりのサンプル数など) は、ファイルに格納でき、タグを使用して変更できます。必要に応じて、新しいタグを承認および追加して、TIFF 形式を拡張できます。 の様に書いてありました。 私は、フォトショップもTIFFフォーマットについてもよく知りませんが、 症状から、同じTIFFフォーマットであっても、 圧縮方法などが異なる場合があるということですね。 (色数なども違っているのかも知れません) なので、同じにはなりません。 bmpやpng形式を使ってはどうでしょうか?

akey
質問者

お礼

ご回答ありがとうございます。 お礼を申し上げるのが遅くなり申し訳ありません。 あまりにも基礎知識がなさすぎて、お恥ずかしい限りです。 bmpやpng形式を使っていいものやらどうかも 判断がつかないような状態です。 もう少し勉強しまして出直したいと思います。

関連するQ&A

  • VB.NETのSendMessageを教えてください

    SendMessageというAPIを試しているのですが、まず試しに Button2.Text = "test" と同じ結果をSendMessageでやってみたいのですが 下のようにしてみたのですが、変更になりませんでした。 どのようにすれば良いかご教授頂ければ幸いです。よろしくお願致します。 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer Private Const WM_SETTEXT As Integer = &HC Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim h As Integer h = Me.Button2.Handle.ToInt32 SendMessage(h, WM_SETTEXT, 0&, "test") End Sub VB.NET2003 FrameWork1.1 WindowsXP-PRO(SP2) です。

  • VB.net(.net framework 3.5 sp1)でフォーム

    VB.net(.net framework 3.5 sp1)でフォーム上に設置したコントロールのプロパティを一括で設定する方法はないでしょうか? 下記は実行しても反映されないのですが、処理のイメージとしてはこんな形です。 Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim test As New Button test.Text = "TEST" test.Top = 0 Me.Button1 = test End Sub End Class

  • VB.NETでのiniファイル読込について。

    .netでのiniファイル読込がうまくいきません。 何が悪いのかさっぱりわかりません。 ご指摘お願いいたします。 環境 os :xp 開発ソフト VB.NET ver 1.1.4322 SP1 ソース Private Declare Function GetPrivateProfileString Lib "kernel32" _ Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String) As Long '実行ファイルパスの取得 *VB6のapp.path Shared Function GetAppPath() As String Return System.IO.Path.GetDirectoryName( _ System.Reflection.Assembly.GetExecutingAssembly().Location) End Function Function INI_DBPATH_READ(ByVal FilePath As String) As String Dim lngRet As Long   '読み込みバッファ(固定長) Dim strGetBuff As String = 256   'iniファイルより読み込む文字列のサイズ Dim intGetSize As Integer   'セクション名 Dim strSection As String   'キー名 Dim strKey As String   '読み込みエラー時の出力文字列 Dim strErr As String   'iniファイル名(フルパス) Dim striniFn As String strGetBuff = Space(256) strSection = "TIFF_FOLDER" strKey = "PATH" strErr = "失敗" striniFn = Replace(GetAppPath(), "\bin", "\Ini") & "\test.ini" intGetSize = 256 'strGetBuffに文字列を取得する lngRet = GetPrivateProfileString(strSection, strKey, strErr, _ strGetBuff, intGetSize, striniFn) '末尾のNull除去 MsgBox(Microsoft.VisualBasic.Left(strGetBuff, InStr(strGetBuff, Chr(0)) - 1)) End Function iniファイルの内容 [TIFF_FOLDER] PATH=成功

  • ファイルの存在の確認をする方法

    こんにちは。 VB.netでプログラミングしているんですが、ファイル処理について質問があります。ファイルを保存する際に、よく「すでにファイルが存在します。上書きしますか?」と聞いてきますよね。これを実現するにはどんな方法があるでしょうか?ただし、コモンダイアログは使いません。FileOpen、FileCloseで実現したいのです。 以下のプログラムをどのように変えたらいいでしょうか?ご教授お願いいたします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   FileOpen(1, Format(Now, "yyyyMMdd") & " .txt", OpenMode.Output)   PrintLine(1, "test")   FileClose(1) End Sub

  • VB.netでSQLserverに接続したい

    VB2008express で SQLserver2000に接続しようとしています フォーム上で ボタンを2つ作成し button1の記述では接続できるのですが button2では接続できず タイムオーバーになります。 SqlConnectionの使い方など基本的な理解不足かと思いますが お気づきの点あればお願いします。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DATACNN As String Dim DATAADO As ADODB.Connection DATACNN = "DRIVER={SQL SERVER};" & "SERVER=TESTSERVER;UID=sa;PWD=123;DATABASE=BD" DATAADO = New ADODB.Connection DATAADO.Open(DATACNN) MsgBox("接続1OK") End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim stConnectionString As String = String.Empty stConnectionString &= "Data Source =TESTSERVER;" stConnectionString &= "persist security info=True;" stConnectionString &= "Database=BD;" stConnectionString &= "user id=sa;" stConnectionString &= "password=123;"  Dim cSqlConnection As New System.Data.SqlClient.SqlConnection(stConnectionString) cSqlConnection.Open()  ’←タイムオーバーになります MsgBox("接続2OK") cSqlConnection.Close() cSqlConnection.Dispose() End Sub

  • tiffファイルについて

    仕事でAUTOCADを使用しており、tiffファイルを貼り付けて作業する事が多いのですが、そのtiffファイルを編集加工する良い方法があれば教えて下さい。 職場のPCにはphotshopがインストールされており、先日、200KBほどのtiffファイルをphotoshopで開いて、一部を消しゴムコマンドで消してtiff形式で保存し直したところ、ファイルサイズが元の約40倍の8MBほどになってしまいました。 試しに、200KBほどのtiffファイルをphotoshopで開いて、そのまま何もしないでtiff形式で保存した場合も8MBほどになってしまいました。 (1)なぜ、何もしていなくて同じ形式のtiff形式で保存しただけでこんなにもファイルサイズが大きくなってしまうのか (2)photoshopでファイルサイズが極端に大きくならないようにtiffファイルを編集加工してtiffファイルで保存する方法(LZW形式やZIP形式での圧縮保存したtiffファイルはAUTOCADで使用できませんでした) (3)ファイルサイズが極端に大きくならないようにtiffファイルを編集加工してtiffファイルで保存出来ソフト(有料でもOK) など、どれか1つでも構いませんので、ご存知の方がいらっしゃったら教えて頂けますか? よろしくお願い致します。

  • VBのこのコードの意味を教えてください。(至急)

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click このコードの意味を教えてください。 よろしくお願いします。

  • VB2005のピクチャーボックス内の図形の移動

    VB2005で、formにPictureBox一つと、Button三つをおいて、Button1で、PictureBoxに丸を書いて、Button2とButton3で、PictureBox内で、丸を右左に移動させようと考えています。で丸を書くことと、同じプロシジャー内では、移動させることはできました。が、別のプロシジャーから移動させるってことは出来るのでしょうか?VB2005をやり始めたばかりなのでてんでわかりません。どなたか詳しい方いらっしゃいましたら教えてください。よろしくお願いします。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.Clear(PictureBox1.BackColor) Dim w As Integer = PictureBox1.ClientSize.Width / 3 Dim h As Integer = PictureBox1.ClientSize.Height / 3 g.ResetTransform() g.DrawEllipse(Pens.Black, 0, 0, w, h) g.TranslateTransform(80, 50) g.DrawEllipse(Pens.Black, 0, 0, w, h) g.ResetTransform() g.Dispose() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim g As Graphics = PictureBox1.CreateGraphics() g.TranslateTransform(80, 50) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End Sub End Class

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • Visual Basic でスクリーンショット

    学生で、visual basic を勉強しているものです Button1をクリックするとスクリーンショットを1秒ごとに撮り、 "c:\iMonitoring"に保存するというプログラムを書いています (Button2をクリックすると止まる) 写真の名前を撮った時刻にしたいのですがエラーが出てうまくいきません どうしていいか分からばいので教えてください (コードです) ********************************************************************************* Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Enabled = False System.IO.Directory.CreateDirectory("C:\iMonitoring") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Timer1.Enabled = False End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim x As String = Now().ToString() Dim a As String = "C:\iMonitoring\" Dim b As String = ".bmp" Dim y As String = (a & x & b) 'Imports System.Drawing 'Imports System.Windows.Forms 'Bitmapの作成 Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, _ Screen.PrimaryScreen.Bounds.Height) 'Graphicsの作成 Dim g As Graphics = Graphics.FromImage(bmp) '画面全体をコピーする g.CopyFromScreen(New Point(0, 0), New Point(0, 0), bmp.Size) '解放 g.Dispose() '保存 bmp.Save(y) End Sub End Class

専門家に質問してみよう