larry118 Ответов: 0

Преобразование 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

0 Ответов