2017-11-22 10 views
0

SOや他の場所で見たすべての質問には、潜在的な問題としてストリームをクローズするかクローズしないと記載されています。それが問題でなければ、保存するディレクトリの存在または権利が問題になります。私はここにそれが当てはまるとは確信していません。部分的には、DBに格納されている特定のtifファイルでのみ発生し、コードはサーバーファイルシステムからファイルを保存または読み込みしていないためです。しかし、私は私の開発マシンをプロダクションサーバーで指し示すと、tifファイルをjpgに変換できます。したがって、特定のファイルでのみ失敗し、実動サーバーでのみ失敗します。tifからjpgに変換するときのGDI +の一般的なエラー

これは私の前に書かれた古い図書館のものです。最近、Windowsサーバー上のTempディレクトリをクリアしました。それが問題を引き起こすかどうかは分かりませんが、私もその情報を投げ捨てると思っていました。

コメントアウトされた内容とされていない内容に応じて、ConvertFrom行またはFromStream行でGDIが失敗します。

私はtifファイルが破損している可能性があると思っていましたが、変換するためにdevマシンを使用することができました。パーミッションやディレクトリの問題は、いくつかのtifファイルで動作するため、問題ではありません。私は何か非常に明らかに欠けているように感じる。試してみるにあたって助けや助言をいただければ幸いです。 Stack Overflowの表示のためにスラッシュをコードに追加しました。書式設定はVBのコメントマーカーでは認識されませんでした。

Private Function image2jpg(ByVal dID As Integer) As System.IO.MemoryStream 
    Dim sql As String = "SELECT blob FROM [Database].[schema].[table] WHERE dID = @dID" 
    Dim params As New DB_Methods.params("@dID", dID) 
    Dim img = DB_Methods.sqlQuickGetUSP(sql, "ADMIN", params, False) 
    Dim demBits As Byte() = CType(img(0)(0), Byte()) 


    //'new code i tried that also fails 
    Dim ic As System.Drawing.ImageConverter = New System.Drawing.ImageConverter() 
    Dim x As System.Drawing.Bitmap = ic.ConvertFrom(demBits) //'this is where GDI fails 
    Dim newImg = x 
    //'Throw New Exception(demBits.Length & " " & ms.Length) 

    //'Original code that was failing 
    //'Dim ms As System.IO.MemoryStream = New MemoryStream(demBits) 
    //'Dim tmpImg As System.Drawing.Image = System.Drawing.Image.FromStream(ms)'this is where GDI fails 
    //'Dim newImg As Drawing.Image = New Drawing.Bitmap(tmpImg, tmpImg.Width, tmpImg.Height) 

    Dim newStream As New MemoryStream 
    newImg.Save(newStream, ImageFormat.Jpeg) 
    Return newStream 
End Function 
+0

かなり漠然としていますが、ファイルとディレクトリについては言いますが、ファイルはまったく使用されていません。これは、画像をdbaseに追加するコードのバグと同じように、より多くのデバッグが必要です。返されたストリームはそのままでは使用できません。そのバグを修正してください。 newStream.Position = 0が必要です。 –

+0

@ HansPassantファイルシステムにファイルをロードしたり保存したりしません。これは、データベース内のvarbinary(max)列を使用します。その列はバイト配列に入れられ、ストリームに入れられます。だから私はディスクに何も書かれていないと思う。もしそれがアップロードコードのバグだったら、私の開発マシンも失敗すると思います。実動サーバーでのデバッグに関するヒントはありますか?あなたはそれが動作しないが、それは動作し、おそらく10年近く働いていると言う。私は//コードを表示するのに役立つコメントを追加しました。 – Kevin

答えて

0

この問題は、CCITTの代わりにJPEG圧縮を使用して作成されたtifファイルに起因しています。 Older GDI TIFF JPEG issues

古いバージョンのGDIでは処理できませんが、新しいバージョンでは処理できません。プロダクションサーバーは2012年、私の開発マシンはWindows 10です。

関連する問題