Aus RTF-Datei Bilder herausholen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-programmer.

    Aus RTF-Datei Bilder herausholen

    Hallo! Wieder hab ich mal ein Problem. Ich habe eine RTF-Datei (mit Text und Bildern) und aus dieser will ich mittels StreamReading alle Bilder finden und in Bildarray packen.
    Dazu hatte ich nur hier was gefunden: vbarchiv.net/forum/read.php?id=22&t=44643&i=44643&v=f
    Allerdings funktioniert das glaub ich nur, wenn da nur ein Bild in der Datei ist.
    Hat jemand Ahnung, wie das zu bewerkstelligen ist?
    Dim sFile As String = "C:\Users\Hagen\Desktop\neu.rtf"
    Dim oStream As New IO.FileStream(sFile, IO.FileMode.Open)
    Dim nBytes(oStream.Length - 1) As Byte
    oStream.Read(nBytes, 0, oStream.Length - 1)
    Dim img As Image = Bitmap.FromStream(oStream)
    oStream.Close()
    PictureBox1.Image = img


    Fehler:

    System.ArgumentException wurde nicht behandelt.
    Message="Ungültiger Parameter."
    Source="System.Drawing"
    img As Image = Bitmap.FromStream(oStream)
    Ja für Text, mit Bildern siehts anders aus ;)

    Du musst nämlich RTF-Codes lesen.
    Mit

    Quellcode

    1. {\object\objemb{\*\objclass Package}\objw2415\objh720{\*\objdata ... }}}

    wird zwar ein Bild angezeichnet, aber statt ... ist halt ein Code wie
    Spoiler anzeigen

    Quellcode

    1. 57265735c53616d706c652050696374757265735c4368727973616e7468656d756d2e6a7067
    2. 000000030037000000433a5c55736572735c554e544552457e315c417070446174615c4c6f6361
    3. 6c5c54656d705c4368727973616e7468656d756d2e6a706700226b0d00ffd8ffe000104a464946
    4. 00010201006000600000ffee000e41646f626500640000000001ffe1135d4578696600004d4d00
    5. 2a000000080007013200020000001400000062013b000200000007000000764746000300000001
    6. 000400004749000300000001003f00009c9d00010000000e00000000ea1c00070000080c000000
    7. 0087690004000000010000007d000000e7323030393a30333a31322031333a34363a343200436f
    8. 726269730000059003000200000014000000bf9004000200000014000000d39291000200000003
    9. 35340000929200020000000335340000ea1c0007000007b40000000000000000323030383a3033
    10. 3a31342031333a35393a323600323030383a30333a31342031333a35393a323600000501030003
    11. 0000000100060000011a00050000000100000129011b0005000000010000013102010004000000
    12. 010000013902020004000000010000121c0000000000000048000000010000004800000001ffd8
    13. ffe000104a46494600010100000100010000ffdb004300100b0c0e0c0a100e0d0e121110131828
    14. 1a181616183123251d283a333d3c3933383740485c4e404457453738506d51575f626768673e4d
    15. 71797064785c656763ffdb0043011112121815182f1a1a2f634238426363636363636363636363
    16. 636363636363636363636363636363636363636363636363636363636363636363636363636363
    17. ffc0001108007800a003012200021101031101ffc4001f00000105010101010101000000000000
    18. 00000102030405060708090a0bffc400b5100002010303020403050504040000017d0102030004
    19. 1105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a
    20. 25262728292a3435363738393a434445464748494a535455565758595a636465666768696a7374
    21. 75767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8
    22. b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9
    23. faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b511
    24. 000201020404030407050404000102770001020311040521310612415107617113223281081442
    25. 91a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a43444546
    26. 4748494a535455565758595a636465666768696a737475767778797a82838485868788898a9293
    27. 9495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6
    28. d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f004be0a2
    29. 08a3c90bb80f7c60d4912a5b6d078dc7a678ce2a9dd1293db1727cbdd93cf71d29d72e668d597e
    30. 621c103d71cd7876d91f55cba58bf2a4732f2391d0fa1f6accbcb96b48c4318f9c8fbf8ab70ca1
    31. 90156ed9155ef63171195c73d460d1195dda428ab3b11e923cd2031ca83fe7f5a9b5452213d722
    32. a2d33744183a94c7a8eb562ee549e16453f381d31d6adbb4ca77e7326ce7f2dca93d48adbdde75
    33. b320c6ec71f5ae7e0c2cbbce70a3f5ed576d2e4acbe5f50c78aba91bea8a946e68da96991246c8
    34. 18fcea3be7d880f6e9f8d06f6357f2901e9c9ec052be26848ebdff00a8ac767a9093bdc8ac2c62
    35. 6612b9dd27de03b2fa7e356eeb6b5b4c9901446dce3dbad32ccfee378e37545772016b264e3729
    36. a2ee5325abc8cdb2492390b4533007dbafd4559b896328de72ef51c1c0c1a2d2d6496251100a3f
    37. be47f2a9ee34b02d1c1762fb49551c64e38cd6ce6b9b565b71895e0d3567b76b895db61fb9bbae
    38. 3d69b3d94d6f66aff68cab282c8cbd011d3bd1f6abc82d92de489581401700e40f43efd2a7b78f
    39. 519e0d9246a23dbf2f987691db1c7f5a6f991376b56558adade28d4c5a8248090c6364207b83d6
    40. 859e33aa4923aee0c06093c74ffeb551bbb668656c3a020e085707f4eb5a76f616b78cc219082e
    41. 995c73b48ebfcc715524b76f71276f9115d3db098c928de08e2353819ff38a8dd98a7daa59807c
    42. 7caa07029d088f4e98c37b1a3827e5959339ff000a89e0867b91f6765641fc2e4e292b2ff31a77
    43. d8bf16ed422815baf9bce3b2e2b42f0c16d67232c4bc0c018f5e33fad53b2289680c43e708496e
    44. f55e79cea2b14030a036e763db1ffebacad795ba0e49b7e4588d5c42f239c3f1b54107273cf7f4
    45. a942b29cbaed38f6a7f9d15b42aa39c0f4e4d556bacca15f2acc09c7b76feb52d5f6435763ae64
    46. 0880fb8eb55649f64e1b34cba9432b2ff91512aab5a49339cb642a7d7a9fd2ae10b2d4bd16e4cd
    47. 12cf78003859305b1fad69496d0416c5a2401906771ebef58d14e222adc971efc0aba9781d194e
    48. 093dbae4539a969d8524dec577936c858723b107353da5c0f9fa71dba567c2b976ca9283866038
    49. 1e9f4a4f33665077ef56e09e855d346aa5d4504490994390304a8247eb51b6fbc9d514111e7e63
    50. fd2b3e26c1cf7e82b4edd7cb81a5ce4819a89454755b936b2b9b308486318ec2aacf3a994a9381
    51. 8c9ff0aab05ff983804e2a9cd2cb712882104bb1cb76c5651a6efa992a767761717f1b5d264911
    52. 8e0b6391effa0a76a6f3cf6fb85c6f87fba87e5fd3ad5a4d1498b0d28cff00b808fcab35ec0cce
    53. ac23f94b6d674031d8640f4f71f5ade2e2de8c6da7b6a2c1a617b3f354e4601e39e0f5fc7ad496
    54. e975a3bb5c341be365dbc30f6e7bd6858235b580594ae23dd923924649fcf359afa9188b46009a
    55. 23d067a7b7d29b726ecb525abad45c4fad1605910aff0008150cfa4cf6c8599940046483535a44
    56. d24fe7db168c8c1fa1f4f715a7aa5d84b165923fde4836800f5f53473b52e54371d5686745706c
    57. a19636c6fc155c7afad352de6b4b3fb51dbb9881b4f614eba786daee6955b3230da8bfdde3ad3e
    58. d239afd1627c08f7658f4c7b0f7ef4b6572efd4cff003e459034992c7a67907e9535c4ac5c1daa
    59. 3df19c9c73cd5a9556caf2489a36687008ee08f7fd6a1b86b436ccb0139c8619e70781c555d37b
    60. 0d32092459179186f5a619316863ee2407f4a8e2272d842c5467a671ef4e9e76941794a9663838
    61. 001e31e957cbd04e57435c118cf52338a789b6aec0a327f8b9cff3c542428085d8e0f503ae2954
    62. 1da085c866c29ef9e3fc6aac4736a3d9f03cb52719c91ef4aac8b906356623a9278fa63fad4492
    63. b46e02121cf523a9a90a1139571b58f4ed8a2c352b80e0939e86affda40b16cf53c0fad66063b7
    64. 27b9ab3105963dadfde073e839cd44e3dcb52bad0d7d0e00b03dc498e7841fcffcfd69b0aa417e
    65. e17f8ceea904a1a3114476a28c03ed4abf6783e7c65c8eac724d73ca5726ceedb27d46f0dbdbe2
    66. 360247e07b5654f7a208e2855f6bb1e4e3ee2ff8ff0085375295e50a2342ef924606702a9ad8dd
    67. cd991a36393c96e3f4aba708a49b21fbab956e5abad43c9711419d98f9b77393d8ff009f5a8eca
    68. d56784aeec4a06719ed4efb07910b4b2a9254640f5ff00eb5518de4f33cd4621fb11dab54935ee
    69. 8eed334e59eeada10151140e320119fd6aa4576ff6812dc6651d0d5dfb59bab574922f988ea3a5
    70. 40962cc48e86a134be22ed77727823b36800995558f3bcff0017e3fd29cf7c9651bfd9e3c8cfca
    71. 074cfd699632452d9456d708081210a7a55bbd8ade2b72a57a0ef50eca5662df4ee640be9e3632
    72. 332b3b72c4afff005e927d40dcab078610c472e170c7f1a6491ec93638f9b763dbdaa17383f4ae
    73. 8496e44ae890dc3ad9f96380cdb89cf5f6a80b298f9ce49ebe9535d342888b10cae3258f524d46
    74. 1b31ab861f2a9501b9cf6ab5b5cce4f5b5fa01590279e23cc41b60246467ae299e62c6cb1f98d2
    75. 201b8ed18c1ee39fcaa71115b740c0820860636c83db91ebcf5fc29b2cfb8bc6a1017241653c63
    76. 3903dba5523369ad6f621e63c48a5b7af5e3a539d946d64627b60d48cf21023046c2c5fd7a8ffe
    77. b0fca9aeaf1c2994503a818e4fa1ff003da81d9abd85521860f3819cd491b745033cd56f31


    halt noch vieeeeeeeel länger.
    Du musst halt rausfinden wies codiert wird, vielleicht Base64?
    Ist leider kein Base64.
    Hier mein Versuch:Funktioniert aber nicht. (in der TextBox1 steht Pfad der RTF-Datei, wo ein Bild drin ist, kein Text)

    VB.NET-Quellcode

    1. Dim sFile As String = TextBox1.Text
    2. Dim oStream As New IO.FileStream(sFile, IO.FileMode.Open)
    3. Dim nBytes(oStream.Length - 1) As Byte
    4. Dim str As String = Convert.ToBase64String(nBytes, Base64FormattingOptions.InsertLineBreaks)
    5. Dim img As Image = ConvertBase64ToImage(str)
    6. PictureBox1.Image = img
    7. Public Function ConvertBase64ToImage(ByVal sData As String) As Image
    8. Dim oImage As Image = Nothing
    9. If sData.Length > 0 Then
    10. Dim nBytes() As Byte = Convert.FromBase64String(sData)
    11. If nBytes IsNot Nothing AndAlso nBytes.Length > 0 Then
    12. With New System.Drawing.ImageConverter
    13. oImage = CType(.ConvertFrom(nBytes), Image)
    14. End With
    15. End If
    16. End If
    17. Return oImage
    18. End Function


    Jemand noch ne idee? Oder gibt es eine Möglichkeit in einer Richtextbox die Bilder rauszuholen?
    Vielleicht andersherum:
    Allen Text aus der RTB löschen, so dass nur noch das Bild drin ist, dieses in die Zwischenablage kopieren und einem Image zuweisen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Weil ich weiß, wie ein Bild im RichText aussieht, würde ich es so machen.
    Füge doch spaßeshalber mal eine bmp, eine gif usw. ein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In RTF-Code steht dies für das Bild drin: (Hexadezimal denk ich mal):
    89504e470d0a1a0a0000000d4948445200000065000000650806000000547c2dcf0000000467414d410000b18e7cfb5193000000206348524d00007a25000080
    830000f9ff000080e8000075300000ea6000003a970000176f97a999d400004d6149444154789c62fcffff3fc36007ff3e9d91fcffebc533a61fd7187e7f7bc7
    f0fbe727866f5fde32fcfff309a71e460e69062e0e360656763e06561e7906064e5586fface2fc4c3cbab8350d120010408c832d52fe7db92cf4efd3051be67f
    cfe5bfbd7fa0f1eef53dedaf3f19183e7e65b4fff0839be1f50f49b0ba076f79197efde3c0690e1bd30f0605e1cf0cec8cef19c478be33f0737e67e060fd374b
    5880ff039f80d86b7611c373bffef07d62e137b8c0c4a5f2875efe23060004d0a08814504e60fc72da85e1f70bf937cf6e18dc7bfa29f8d1476186e75f44191e
    (GEKÜRZT!!)

    Das kann ich auch aus RTF-Datei extrahieren und in String-Variable packen. Jetzt hab ich im Netz folgendes zum Konvertieren von Hex zu Image gefunden:

    VB.NET-Quellcode

    1. Function Get_Image_From_Hex(ByVal hexstring As String) As Image
    2. Dim imageByte() As Byte = hextoByteArray(hexstring)
    3. Dim mm As IO.MemoryStream = New IO.MemoryStream(imageByte)
    4. Dim img As Image = System.Drawing.Image.FromStream(mm)
    5. Return img
    6. End Function
    7. Private Function hextoByteArray(ByVal hexString As String) As Byte()
    8. Dim bytesCount As Integer = (hexString.Length) / 2
    9. Dim bytes(bytesCount) As Byte
    10. Dim x As Integer = 0
    11. While x < bytesCount
    12. bytes(x) = Convert.ToByte(hexString.Substring(x * 2, 2), 16) 'Hier der fehler
    13. x += 1
    14. End While
    15. Return bytes
    16. End Function

    Da kommt nun aber folgender Fehler: System.FormatException wurde nicht behandelt.
    Message="Es konnten keine bekannten Ziffern gefunden werden." :cursing:

    Woran könnte das liegen? (wäre ja auch zu schön gewesen, hätte es geklappt)
    Bei mir kommt in der Zeile

    VB.NET-Quellcode

    1. Dim img As Image = System.Drawing.Image.FromStream(mm)
    der Fehler "Ungültiger Parameter.
    Der Rest läuft.
    Kann es sein, dass Dein Hex-String ungültige Zeichen enthält?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hast du bei deinem versuch den Hex-String aus einer RTF-Datei kopiert und benutzt? Ich hab das jetzt mal per Hand aus der RTF-Datei geholt und meiner Funktion als Parameter übergeben. Wieder der gleiche Fehler mit den ungültigen Zeichen. Ich glaub ich gebs bald auf.
    Es muss doch eine Möglichkeit geben, ein in der RichTextBox.selectedrtf (welches den typ Bild hat) ins Clipboard zu kopieren und in eine Image-Variable zu hauen.- Mit Strg+C kann man ja schon ohne eigenes Zutun ein Bild kopieren und z.B. in Paint dann einfügen. Aber auch hier nicht in ein Image.
    :thumbsup: :thumbsup: :thumbsup:
    Ich hab es gemacht, es funktioniert.

    VB.NET-Quellcode

    1. Dim ii As Image = Get_Image_From_Hex(txt)
    2. ii.Save(txtFile.Text & ".bmp", System.Drawing.Imaging.ImageFormat.Bmp)
    Mit diesem Code und Deinem Code von oben hab ich ein Bild gespeichert, es funktioniert. Nur die Bildgröße stimmt nicht.
    Sieh Dir mal in Deinem gesamten Quelltext an, wie die Pixelinformation Deines Bildes aussieht.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim txt As String = "" & _
    2. "0100090000030e3900000000f83800000000050000000b0200000000050000000c02060a550af8" & _
    3. "380000430f2000cc0000006100640000000000060a550a00000000280000006400000061000000" & _
    4. "0100180000000000ac710000c40e0000c40e0000000000000000000020312424322728322c2930" & _
    5. "2d29302d2c3231222a2a2b30312d30352f30343236372b322f2a342e2a3330303435333738333a" & _
    6. "372d34313034353036352c38322d3a322f36313138312d382e2b362e2f373732373a3034352f33" & _
    7. "342c32312c34332a36362c383a31373c2c32372c3735333e3c333b3b3038382d35342c33303136" & _
    8. "352e32332d34372e343931333b2e303831333d292e37282d36262c37242d372f35402c2e382a2c" & _
    9. "342d2f372b2f34252e322730342a2e332b2f342d3136292d322c2f332f3433272e2b272e29242d" & _
    10. "2a2a33302a333026302a2a342e2c372f2d372b2f392d2b322b2b302e2b302f3134322c31282e31" & _
    11. "282f312b30312d32342e2c302a3134322f34322b302e2f34322a302b2d342d2c322d2d342d2f35" & _
    12. "2a32362a31322835362c34352c3132281c2a28202e2a25312b28332b29312a282f2a292f2e292e" & _
    13. "2f282e332e35382a32312e37342c3630333a372b302f2c31302d32303136343438392c30313338" & _
    14. "392f3534323735313732343c352a342e2d35342f37372e36362d35352d35342933332a363c2833" & _
    15. "3b2d37411b24311e2832242d3a1f28362b3344273240303a4b2d3447333a4d2e374b313950272f" & _
    16. "462a3249242c432c374d313c52303a521e28402f364f272f462b31482329401e2539181f331e25" & _
    17. "381a2033151c2d1c2334171e2f232837272b36282e33272f2f2b33322d363328312e2f37302a32" & _
    18. "2b2e372d30382e2b322b2d302e2c2e2e2b2e2c2d312c292f2430362b33343030312f2d2e2c3334" & _
    19. "3030342f2f362f2a312a2b332c2b332c2d342f3036312d312b2c302530342833372c32362a3034"
    20. ' usw.

    --------------------------------
    Du musst den String mit den Bildinformationen noch etwas bearbeiten:

    VB.NET-Quellcode

    1. txt = txt.Replace(" ", "").Replace(vbCrLf, "")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()