이것은 이미지를 회전하는 데 사용한 코드입니다. 네트워크를 통해 보내야합니다. 이미지가 제대로 회전하고 있지만 이미지가 제대로 표시되지 않습니다. 이 코드는 cpp에서 네이티브로 작성했습니다. DecodeNV21() 3 개의 매개 변수 너비, 높이, 회전이 있습니다. 폭과 높이가 640,480입니다. 회전이 세로 인 경우 변수 회전은 1이고 높이와 너비는 640,480이됩니다. 회전은 가로 0입니다. 너비와 높이 640 및 480. 어느 누구도이 문제를 해결할 수 있도록 도와주세요. 해협 모드 회전은 정확합니다. 그러나 문제가있는 가로 모드입니다.안드로이드 카메라에서 NV21 이미지를 디코딩하지만 이미지의 색상이 올바르지 않습니다.
void DecodeNV21(int SrcHeight,int SrcWidth,int rotation)
/* decodes NV21-encoded image data, which is the default camera preview image format. */
{
//int SrcWidth = encoderContext.m_width;
//int SrcHeight = encoderContext.m_height;
int Rotate = rotation;
int Alpha = 0xFF;
int AlphaMask = Alpha << 24;
/* Rotation involves accessing either the source or destination pixels in a
non-sequential fashion. Since the source is smaller, I figure it's less
cache-unfriendly to go jumping around that. */
int DstWidth = (Rotate & 1) != 0 ? SrcHeight : SrcWidth;
int DstHeight = (Rotate & 1) != 0 ? SrcWidth : SrcHeight;
bool DecrementRow = Rotate > 1;
bool DecrementCol = Rotate == 1 || Rotate == 2;
int LumaRowStride = (Rotate & 1) != 0 ? 1 : SrcWidth;
int LumaColStride = (Rotate & 1) != 0 ? SrcWidth : 1;
int ChromaRowStride = (Rotate & 1) != 0 ? 2 : SrcWidth;
int ChromaColStride = (Rotate & 1) != 0 ? SrcWidth : 2;
// LOGME("DecodeNV21 decoding w:%d,h:%d,DecrementRow:%d,ChromaRowStride:%d, DecrementCol:%d,ChromaColStride:%d,LumaRowStride%d,LumaColStride:%d",DstWidth,DstHeight,DecrementRow,ChromaRowStride, DecrementCol,ChromaColStride,LumaRowStride,LumaColStride);
int dst = 0;
int i=0;
for (int row = DecrementRow ? DstHeight : 0;;)
{
if (row == (DecrementRow ? 0 : DstHeight))
break;
if (DecrementRow)
{
--row;
} /*if*/
for (int col = DecrementCol ? DstWidth : 0;;)
{
if (col == (DecrementCol ? 0 : DstWidth))
break;
if (DecrementCol)
{
--col;
} /*if*/
int Y = 0xff & (int)byte_array[row * LumaRowStride + col * LumaColStride]; /* [0 .. 255] */
/* U/V data follows entire luminance block, downsampled to half luminance
resolution both horizontally and vertically */
/* decoding follows algorithm shown at
<http://www.mail-archive.com/[email protected]/msg14558.html>,
except it gets red and blue the wrong way round */
int Cr =
(0xff & (int)byte_array[SrcHeight * SrcWidth + row/2 * ChromaRowStride + col/2 * ChromaColStride]) - 128;
/* [-128 .. +127] */
int Cb =
(0xff & (int)byte_array[SrcHeight * SrcWidth + row/2 * ChromaRowStride + col/2 * ChromaColStride + 1]) - 128;
/* [-128 .. +127] */
int r,g,b;
int color =
AlphaMask
|
(r=max(
min(
(int)(
Y
+
Cr
+
(Cr >> 1)
+
(Cr >> 2)
+
(Cr >> 6)
),
255
),
0
))
<<
16 /* red */
|
(g=max(
min(
(int)(
Y
-
(Cr >> 2)
+
(Cr >> 4)
+
(Cr >> 5)
-
(Cb >> 1)
+
(Cb >> 3)
+
(Cb >> 4)
+
(Cb >> 5)
),
255
),
0
))
<<
8 /* green */
| (b=max(
min(
(int)(
Y
+
Cb
+
(Cb >> 2)
+
(Cb >> 3)
+
(Cb >> 5)
),
255
),
0
)); /* blue */
//color = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
TypeConvert::udwordToBytes(color, encoderContext.m_in_Array_Encode,i * 4);
i++;
if (!DecrementCol)
{
++col;
} /*if*/
} /*for*/
if (!DecrementRow)
{
++row;
} /*if*/
} /*for*/
} /*DecodeNV21*/
내 질문이 저를 보자 취소되지 않은 경우 inform.I 나는이 코드를 시도했지만 내가 ("색상을 TypeConvert :: udwordToBytes을 사용하고 있기 때문에 넣어은 encoderContext있을 수있는을하지 않았다 –