tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Exceptionがcatchできない
投稿日: 2009/12/05(Sat) 09:18
投稿者ダンボ
皆さんこんにちは。
jpeg埋め込みサムネールを活用するのに、System.Drawing.ImageのGetThumbnailImage()
メソッドを使っていましたが、今ひとつ速度が遅くて向上策を探していました。

http://www.vbforums.com/showthread.php?t=342386
試したところ、劇的に速くなりました。MrPoliteさん、どうもありがとうございます。
vb.net(VB2005)に直したコードは下記のGetThumbnailです。

扱っているjpeg画像にはサムネールが含まれないケースが少ないので、その場合だけ例外に
した方が更に速度向上になると思い改修したのが、GetThumbnail_1とGetThumbnail_2ですが
いずれもArgumentExceptionをcatchできません。何故?
http://msdn.microsoft.com/ja-jp/library/system.drawing.image.getpropertyitem%28VS.80%29.aspx
で言うように確かにArgumentExceptionは発生するのですがcatchできません。
(返信は遅れるかもしれませんがよろしくお願いします)

Private Function GetThumbnail(ByVal path As String) As Image
    Const THUMBNAIL_DATA As Integer = &H501B
    Dim p As Imaging.PropertyItem
    Using fs As IO.FileStream = IO.File.OpenRead(path)
        Using img As Image = Image.FromStream(fs, False, False)
            Dim propertyFound As Boolean = False
            For i As Integer = 0 To img.PropertyIdList.Length - 1
                If img.PropertyIdList(i) = THUMBNAIL_DATA Then
                    propertyFound = True
                    Exit For
                End If
            Next
            If Not propertyFound Then
                Return Nothing
            End If
            p = img.GetPropertyItem(THUMBNAIL_DATA)
            fs.Close()
        End Using
    End Using

    Dim imageBytes As Byte() = p.Value
    Using stream As New IO.MemoryStream(imageBytes.Length)
        stream.Write(imageBytes, 0, imageBytes.Length)
        Return Image.FromStream(stream)
    End Using
End Function

(ArgumentExceptionがcatchできない)
Private Function GetThumbnail_1(ByVal path As String) As Image
    Const THUMBNAIL_DATA As Integer = &H501B
    Dim p As Imaging.PropertyItem
    Try
        Using fs As IO.FileStream = IO.File.OpenRead(path)
            Using img As Image = Image.FromStream(fs, False, False)
                p = img.GetPropertyItem(THUMBNAIL_DATA)
            End Using
            fs.Close()
        End Using
        Dim imageBytes As Byte() = p.Value
        Using stream As New IO.MemoryStream(imageBytes.Length)
            stream.Write(imageBytes, 0, imageBytes.Length)
            Return Image.FromStream(stream)
        End Using
    Catch ex As Exception
        Return Nothing
    End Try
End Function

Private Function GetThumbnail_2(ByVal path As String) As Image
    Const THUMBNAIL_DATA As Integer = &H501B
    Dim p As Imaging.PropertyItem
    Using fs As IO.FileStream = IO.File.OpenRead(path)
        Using img As Image = Image.FromStream(fs, False, False)
            Try
                p = img.GetPropertyItem(THUMBNAIL_DATA)
            Catch ex As System.ArgumentException
                Return Nothing
            Finally
                fs.Close()
            End Try
        End Using
    End Using
    Dim imageBytes As Byte() = p.Value
    Using stream As New IO.MemoryStream(imageBytes.Length)
        stream.Write(imageBytes, 0, imageBytes.Length)
        Return Image.FromStream(stream)
    End Using
End Function

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。