2012-10-17 26 views
0

“OFD是打开文件对话框DirectCast不工作​​

Dim img As Bitmap 
Dim iscmyk As Boolean 
Dim i As String 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 


    ofd.Filter = "Jpg Image(*.jpg)|*.jpg" 
    If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then 
     img = Bitmap.FromFile(ofd.FileName) 
     iscmyk = ((DirectCast(img.Flags, Imaging.ImageFlags) And Imaging.ImageFlags.ColorSpaceCmyk) = Imaging.ImageFlags.ColorSpaceCmyk) 
    End If 
    img = New Bitmap(img, New Size(120, 190)) 
    MsgBox("cmyk = " & iscmyk) 
    PictureBox1.Image = img 
End Sub 

我需要检查,如果图像是CMYK或RGB 如果CMYK然后iscmyk返回true 如果它不是那么CMYK iscmyk在返回false 我Windows 7的PC其返回false每个&每个图像 但在XP它返回完美的答案

为什么它不在我的其他的win7电脑工作???

+0

你说DirectCast不工作​​。你有错误吗?该行被执行时,img.Flags的值是多少? –

+0

不是没有得到错误,但它给出了错误的结果 – Dandy

+0

我试图CInt而不是直接播放,但CInt不工作在XP – Dandy

回答

2
  • 首先,对不起,应对这么晚...
  • 二,其实我不知道 为什么你在不同的操作系统版本不同的结果。

无论如何,这里是一个低级(和丑陋)的解决方法。它是专为JPEG图像:

Public Shared Function GetJpegBpp(FileName As String) As Integer 
    Dim len As Integer 
    Dim fp As FileStream = Nothing 
    Dim marker(1) As Byte 
    Dim data(15) As Byte 
    Dim components As Byte = 0 

    GetJpegBpp = -2 
    Try 
     fp = New FileStream(FileName, FileMode.Open, FileAccess.Read) 
     GetJpegBpp = -1 
     If fp.Read(marker, 0, 2) < 2 OrElse marker(0) <> &HFF OrElse marker(1) <> &HD8 Then Exit Function 
     Do 
      If fp.Read(marker, 0, 2) < 2 OrElse marker(0) <> &HFF OrElse (marker(1) > 1 And marker(1) < &HC0) Then Exit Function 
      If (marker(1) < &HD0 Or marker(1) > &HD9) AndAlso marker(1) > 1 Then 
       If fp.Read(data, 0, 2) < 2 Then Exit Function 
       len = (CInt(data(0)) << 8) Or data(1) 
       len -= 2 
       If len < 0 Then Exit Function 
       If (marker(1) >= &HC0) And (marker(1) <= &HC3) Then 
        If len < 9 OrElse fp.Read(data, 0, 6) < 6 Then Exit Function 
        components = data(5) 
        If components = 0 OrElse components = 2 OrElse components > 4 OrElse (components * 3 + 6) <> len Then Exit Function 
        len -= 6 
       ElseIf marker(1) = &HDA Then 
        If len < (4 + 2 * components) Or (fp.ReadByte() <> components) Then Exit Function 
        len -= 1 
       End If 
       fp.Position += len 
      End If 
     Loop Until marker(1) = &HDA Or marker(1) = &HD9 
     If components = 0 OrElse marker(1) = &HD9 OrElse (fp.Length - fp.Position) < 3 Then Exit Function 
    Catch 
     Exit Function 
    Finally 
     If Not fp Is Nothing Then fp.Close() 
    End Try 
    GetJpegBpp = components * 8 
End Function 

您需要替换该行

iscmyk = ((DirectCast(img.Flags, Imaging.ImageFlags) And Imaging.ImageFlags.ColorSpaceCmyk) = Imaging.ImageFlags.ColorSpaceCmyk) 

与此:

iscmyk = (GetJpegBpp(ofd.FileName) = 32) 

最后,我还没有测试此代码与CMYK JPEG图像,但我想它应该工作...

+0

你的代码是完美的工作 – Dandy