2010-09-13 2 views
1

Какую переменную я должен инициализировать и как это сделать?Как мне вызвать функцию, которая ожидает параметр Byte [] [] []?

Например

byte[][][] data = ?????; 

Функция из библиотеки LibJpeg.NET. Определение функции является

Int32 jpeg_read_raw_data (
    Byte[][][] data, 
    Int32 max_lines 
) 

Там нет хорошей документации для этой функции, так что я не знаю, что послать его, но я хочу, чтобы попытаться отправить что-то и посмотреть, что функция будет возвращать.

Проблема в том, что я не знаю, как это назвать.

+0

Что вы на самом деле пытаетесь сделать? Предполагаю, вы пытаетесь открыть изображение в формате JPEG? –

+0

да, я пытаюсь открыть jpeg-образ, но я хочу открыть его таким образом, что у меня есть доступ к блокам 16x16 mcu, потому что я хочу присоединиться к jpeg-изображениям без потери качества. поэтому встроенная функция не сделает этого. – Karim

ответ

1

После короткого взгляда на источники LibJpeg.NET это выглядит, как вы должны инициализировать первую размерность data массива с числом строк развертки:

byte[][][] data = new byte[max_lines][][]; 

Остальная часть массива заполняется при чтение необработанных данных.

Я не слишком хорошо знаком с этим API, поэтому не знаю, как бы вы получили количество строк сканирования.

+0

ну, я пробовал это, но он не работает с возвратом «звонок в библиотеку JPEG в состоянии 202» – Karim

+0

i set максимальные линии должны быть 10 и пробовали с 10. – Karim

+1

@Karim: Я думаю, max_lines должен быть высотой изображения, деленной на высоту MCU. –

2
byte[][][] data is a 3 dimensional array, allocate it accordingly 

= {{{0,1,2}{3,4,5}{6,7,8}} 
    {{0,1,2}{3,4,5}{6,7,8}} 
    {{0,1,2}{3,4,5}{6,7,8}}} 

ПРИМЕЧАНИЕ! ЭТО НЕ БУДЕТ РАБОТАТЬ! Это массив с зазубринами, поэтому, если вы не определяете данные в виде байта [3,3,3], вы ничего не пойдете.

Мне пришло в голову: я понятия не имею, почему вы используете эту библиотеку. Есть ли причина, по которой встроенные классы .NET JPEG недостаточны? Если это так, я полагаю, что был бы способ использовать библиотеку LibJpeg.NET, чтобы получить поток байтов из файла и организовать его в 3D-массив. Это кажется очень «взломанным» способом сделать это, и это заставляет меня задаться вопросом, является ли это просто портом библиотеки C без обновлений, которые вписываются в инфраструктуру, например .NET или даже OOP.

+0

Мне нравится, как вы инициализируете массив, но уверены ли вы, что это работает? Насколько я знаю, эти инициализаторы работают только на многомерных массивах, а не на зубчатых массивах. – Heinzi

+0

Да, я пытаюсь объединить несколько файлов jpeg без потерь, и поэтому встроенные классы .net image не будут этого делать. но в любом случае я не хочу инициализировать массив каким-либо значением, потому что он предположил, что библиотека даст мне массив со значениями, поэтому он должен быть пустым массивом и лучше без каких-либо параметров, так как я не знаю, что будет возвращать библиотека. (я знаю только первую длину, так как я могу установить ее на 100 и установить параметр max_lines на 100 тоже) – Karim

+0

Вы правы Хайнци! Я даже не думал о том, что это зубчатый массив, а не 3-мерный. Не то, с чем я обычно сталкиваюсь! – Firoso

2

byte[][][] - массив (массивы (массивы байтов)), также называемый массив jagged. Это не так же, как трехмерный массив (например, byte[,,] x = new byte[10,5,3];).

Вот пример для выделения и инициализации такой структуры:

 byte[][][] a = new byte[10][][]; 
     for (int i = 0; i < 10; i++) 
     { 
      a[i] = new byte[5][]; 
      for (int ii = 0; i < 5; i++) 
      { 
       a[i][ii] = new byte[3]; 
       a[i][ii][0] = 42; 
       a[i][ii][1] = 52; 
       a[i][ii][2] = 62; 
      } 
     } 

Да, и кстати, вот связанный с этим вопрос: C# 3 dimensional array definition issue.

И вот запись MSDN на зубчатых массивах: http://msdn.microsoft.com/en-us/library/2s05feca.aspx.

+0

хороший способ сделать это итеративно, а не декларативный. – Firoso

+0

Ну, я пытался инициализировать массив, как у, но библиотека вернула ошибку [Неправильный вызов в библиотеку JPEG в состоянии 202] – Karim

1

Просто исправить firoso Ответим, вы можете выделить массивы, как это, он просто не указал типы, как требуется в C# (его код будет работать в Java, AFAIK)

private byte[][][] lol = 
     { 
      new[] 
       { 
        new byte[] {0, 1, 2}, 
        new byte[] {3, 4, 5}, 
        new byte[] {6, 7, 8} 
       }, 
      new[] 
       { 
        new byte[] {0, 1, 2}, 
        new byte[] {3, 4, 5}, 
        new byte[] {6, 7, 8} 
       }, 
      new[] 
       { 
        new byte[] {0, 1, 2}, 
        new byte[] {3, 4, 5}, 
        new byte[] {6, 7, 8} 
       } 
     }; 

new[] является на самом деле ярлык для new byte[][] и new byte[] не может быть сокращен до new[], так как тогда компилятор записывает номера типов как int.

Я бы не рекомендовать этот метод, если вы можете использовать итеративный метод Хайнци; Я только указываю, что можно выделить многомерные массивы, подобные этому (это хорошо для большого количества конкретных данных).

Смежные вопросы