Bildkompression ändern

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Bildkompression ändern

    Hallo,

    ich versuche ein VB6-Scanprogramm nachzubauen, dieses mal mit WIA statt mit Twain. Der Probleme waren viele, die meisten sind gelöst. Ich habe im folgenden Code die Problemstellen markiert. Da die Dateien mit rund 2 MB viel zu groß geworden sind und der einzige Unterschied zu den VB6-Scans, der mir auffiel, die verwendete Kompression ist, wollte ich auf das Faxformat komprimieren.

    Zum einen weiß ich nicht, wie ich den Encoder handhaben soll - den Quellcode habe ich aus einem Forum. Zum anderen funktioniert hier bei meinem Einzugsscanner, der viele Blätter nacheinander einziehen kann, die Erkennung, ob noch ein Papier einliegt (bScanHasMorePages), nicht, der documentHandlingStatus.Value() ist immer 5 - da habe ich mir erstmal mit der Abfrage eines Fehlercodes geholfen - gar nicht schön und wohl auch nicht ganz korrekt :(

    Ich habe die Fehlerstellen mit {!} und mit Pfeilen markiert. Vllt. hat ja jmd. eine Idee ;)

    VB.NET-Quellcode

    1. Imports WIA
    2. ...
    3. Dim bHasMorePages As Boolean = True
    4. Dim n As Integer = 0
    5. While bHasMorePages
    6. Dim image As WIA.ImageFile = Nothing
    7. Dim Item As WIA.Item = TryCast(device.Items(1), WIA.Item)
    8. Try
    9. Dim WiaCommonDialog As WIA.CommonDialog = New WIA.CommonDialog()
    10. image = DirectCast(WiaCommonDialog.ShowTransfer(Item, WIA.FormatID.wiaFormatTIFF, False), WIA.ImageFile)
    11. Dim imageBytes = CType(image.FileData.BinaryData, Byte())
    12. Dim ms = New System.IO.MemoryStream(imageBytes)
    13. Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(ms)
    14. 'Umwandeln in Graustufen
    15. Dim newBitmap As Bitmap = New Bitmap(image.Width, image.Height)
    16. Using g As Graphics = Graphics.FromImage(newBitmap)
    17. Dim colorMatrix As System.Drawing.Imaging.ColorMatrix = New System.Drawing.Imaging.ColorMatrix(New Single()() {New Single() {0.3F, 0.3F, 0.3F, 0, 0}, New Single() {0.59F, 0.59F, 0.59F, 0, 0}, New Single() {0.11F, 0.11F, 0.11F, 0, 0}, New Single() {0, 0, 0, 1, 0}, New Single() {0, 0, 0, 0, 1}})
    18. Dim imageAttributes As System.Drawing.Imaging.ImageAttributes = New System.Drawing.Imaging.ImageAttributes
    19. imageAttributes.SetColorMatrix(colorMatrix)
    20. g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, imageAttributes)
    21. End Using
    22. 'Grosses Bild speichern - funktioniert
    23. Dim sFileName2 As String = "C:\tmp\PictureGrey_" & n.ToString() & ".tif"
    24. newBitmap.Save(sFileName2, System.Drawing.Imaging.ImageFormat.Tiff)
    25. 'Bildkompression ändern - funktioniert nicht
    26. Dim myImageCodecInfo() As System.Drawing.Imaging.ImageCodecInfo
    27. '------->
    28. myImageCodecInfo = {!}myImageCodecInfo.GetEncoderInfo("image/tiff")
    29. Dim myEncoder As System.Drawing.Imaging.Encoder
    30. myEncoder = System.Drawing.Imaging.Encoder.Compression
    31. Dim myEncoderParameters As System.Drawing.Imaging.EncoderParameters
    32. myEncoderParameters = New System.Drawing.Imaging.EncoderParameters(1)
    33. '------->
    34. Dim myEncoderParameter As {!}EncoderParameter
    35. myEncoderParameter = New System.Drawing.Imaging.EncoderParameter(myEncoder, System.Drawing.Imaging.EncoderValue.CompressionCCITT4)
    36. myEncoderParameters.Param(0) = myEncoderParameter
    37. '------->
    38. newBitmap.{!}Save(sFileName2, myImageCodecInfo, myEncoderParameters)
    39. Catch ex As Exception
    40. '------->
    41. If Err.Number = {!}-2145320957 Then
    42. 'Nichts mehr einzuziehen
    43. Exit Sub
    44. End If
    45. MessageBox.Show("Error : " + ex.Message)
    46. Finally
    47. Item = Nothing
    48. Dim documentHandlingSelect As [Property] = Nothing
    49. Dim documentHandlingStatus As [Property] = Nothing
    50. For Each prop As [Property] In device.Properties
    51. If prop.PropertyID = WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT Then
    52. documentHandlingSelect = prop
    53. End If
    54. If prop.PropertyID = WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS Then
    55. documentHandlingStatus = prop
    56. End If
    57. Next
    58. bHasMorePages = False
    59. If documentHandlingSelect IsNot Nothing Then
    60. If (Convert.ToUInt32(documentHandlingSelect.Value()) And WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) <> 0 Then
    61. bHasMorePages = ((Convert.ToUInt32(documentHandlingStatus.Value()) And WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) <> 0)
    62. End If
    63. End If
    64. n += 1
    65. End Try
    66. End While


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Zenker Hmm. GetEncoderInfo ist kein Member von ImageCodecInfo! k.A. wo Du das her kopiert hast. Wenn dann wäre GetEncoderInfo eine eigenständige Funktion der Dir den passenden Encoder zurück gibt.

    Ansonsten: k.A. wann da was an der GDI+ geändert wurde. Anscheinend muss das Bild nicht mehr im 1bppIndexed-Format vorliegen damit ein TIFF mit CCITT4 gespeichert werden kann. War aber mal so. ;)
    Mfg -Franky-