Преобразование memorystream ushort()(, ) в byte() в VB .NET
Привет еще раз,
Я работал над приложением, которое на 98% завершено в vb .net. Если бы я знал, что я получаю в использовании vb для обработки изображений, я бы использовал C#, но я уже далеко в пути, и я думаю/надеюсь, что это моя последняя проблема.
Еще раз большое спасибо всем тем,кто разместил фильтры, квантователи, различные функции изображения и т. д. Перевод c,c++ и c# на vb .net был непростой задачей, но выполнимый. Почему я использую vb .net? Ну а как консультант, который кодирует и занимается бизнес-анализом в течение многих лет, я видел довольно много кода. Нет никаких сомнений в том, что VB является наиболее разборчивым. Те из вас, кто достаточно стар, чтобы помнить APL, я должен сказать вам, что много раз я находил C++ и C# такими же плотными, как APL. Другое дело, что со временем скорость имеет все меньшее значение для того типа приложений, над которыми я работал. Так что наносекунды никогда не имели для меня значения.
Хватит болтовни и оправданий, моя проблема вот в чем:
Работая в VB, его легко использовать Byte() для memorystream и обратно. Но при переводе некоторого старого кода на языке Си я вижу UShort () (,), используемый для потоков памяти. VB не хватает ушортов такого типа.
Когда я пытаюсь преобразовать stream()(,) в массивы байтов, возникает серьезная проблема: массив байтов не индексируется. Можно легко преобразовать байт
Dim vIn As UShort = 0 Dim vOut As Byte() = BitConverter.GetBytes(vIn)
но это не помогает с индексом и массивом в формате ushort () (,).
Итак, пример проблемного кода таков:
Следующая строка кода взята из
Copyright © 2007 by Libor Tinka Resampling project. Thanks Libor.
intensity = (intensity + (input(c)(contrib(i).p(j).pixel, k) * weight))
входные данные были объявлены как ()(,)
Вы получаете: "структурный байт не может быть индексирован, потому что у него нет свойства по умолчанию.
Я также хотел создать небольшую функцию, которая может обрабатывать байт () (,) в значения (24 бит, так что 3 значения для RGB и обратно, чтобы облегчить преобразование.
Ларри
Что я уже пробовал:
Public Function Resample(ByVal input As Byte(), ...) As Byte()(,)
For c = 0 To planes - 1 work(c)(,) = Byte(outWidth, inHeight) 'UShort(outWidth - 1, height - 1) {} output(c) = New UShort(outWidth - 1, outHeight - 1) {} Next
work(c)(i, k) = CType(Math.Min(Math.Max((intensity / contrib(i).wsum), UInt16.MinValue), UInt16.MaxValue), System.UInt16)
Gerry Schmitz
Используйте BinaryReader.
https://docs.microsoft.com/en-us/dotnet/api/system.io.binaryreader?view=netframework-4.8