2014-12-05 3 views
1

Редактировать: Второй пример кода - правильный ответ. Моя проблема была вне ротации растрового изображения, поэтому второй пример кода - это ответ на вопрос в заголовке.Поверните растровое изображение, сохраненное в массиве 1D

Я пытаюсь повернуть растровое изображение, сохраненное в массиве 1D (_pixelData). Я просто не могу заставить его работать. Может ли кто-нибудь указать мне в правильном направлении или дать примерное решение.

Изображение 320 × 240 пикселей и хранится в 1D массиве (первые 320 значений представляют собой первую строку в растровом изображении, следующую 320 следующую строку и т. Д.).

Я не хочу писать его на writebitmap, чтобы повернуть его туда и преобразовать его в массив int. Я хочу использовать массив int. Причина этого в том, что источник поступает из камеры как данные ARGB, и я хочу сохранить это просто.

Вот что у меня (не работает. В результате сломана изображение, где вертикальные линии не встречаются)

// Rotate the data for Portait Mode 
      int height = 320; 
      int width = 240; 
      int[] _pixelDataRotated = new int[width* height]; 
      for (int y = 0; y < height; y++) 
      { 
       for (int x = 0; x < width; x++) 
        _pixelDataRotated[x * height + height - y - 1] = _pixelData[x + y * width]; 
      } 

Это, как я сделал это, и это делает для вращение. Это ответ.

for (int x = 0; x < width; x++) 
     for (int y = 0; y < height; y++) 
     _pixelDataRotated[y + x * height] = _pixelData[x + y * width]; 
+1

Не могли бы вы привести пример (исходный результат)? «Поворот» может означать много чего. –

+0

@ScottHunter Забыл добавить, что я пытаюсь повернуть его на 90 градусов (точно). – Hardev

+0

При повороте изображения 320x240 изображение становится 240x320; вы приняли это во внимание? –

ответ

-1

Это был ответ. Это было в моем первоначальном вопросе в качестве примера, но я думал, что он сломан, но оказалось, что фактическая проблема была в размерах растрового изображения, а не в алгоритме для 90-градусного вращения.

// _pixelData is the source array _pixelDataRotated the target array 
for (int x = 0; x < width; x++) 
    for (int y = 0; y < height; y++) 
    _pixelDataRotated[y + x * height] = _pixelData[x + y * width]; 
+0

Что произойдет, если вы дважды запустите этот код? Для меня это просто переворачивает изображение назад вместо того, чтобы вращать его еще на 90 градусов. – Waltari

0

x - источник. y - roteted;

 var x = new[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 
     var y = new int[12]; 
     var width = 4; 
     var height = 3; 

     for (var i = 0; i < width; i++) 
      for (var j = 0; j < height; j++) 
      { 
       y[i * height + j] = x[j * width + i]; 
      } 
Смежные вопросы