int decodeJpegData(char* jpegData, int jpegSize, int maxPixels, Bitmap* bitmap) { int returnCode; int maxWidth; int maxHeight; // Decode red channel returnCode = decodeJpegChannel(jpegData, jpegSize, 0, &(*bitmap).red, &(*bitmap).redWidth, &(*bitmap).redHeight); if (returnCode != MEMORY_OK) { LOGE("Failed to decode red channel"); njDone(); freeUnsignedCharArray(&(*bitmap).red); return returnCode; } doTransforms(bitmap, 1, 0, 0); // Resize red channel getScaledSize((*bitmap).redWidth, (*bitmap).redHeight, maxPixels, &maxWidth, &maxHeight); //We only need to do this once as r, g, b should be the same sizes returnCode = resizeChannel(&(*bitmap).red, (*bitmap).redWidth, (*bitmap).redHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { njDone(); freeUnsignedCharArray(&(*bitmap).red); return returnCode; } // Set red channel dimensions if ((*bitmap).redWidth >= maxWidth && (*bitmap).redHeight >= maxHeight) { (*bitmap).redWidth = maxWidth; (*bitmap).redHeight = maxHeight; } // Decode green channel returnCode = decodeJpegChannel(jpegData, jpegSize, 1, &(*bitmap).green, &(*bitmap).greenWidth, &(*bitmap).greenHeight); if (returnCode != MEMORY_OK) { LOGE("Failed to decode green channel"); njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); return returnCode; } doTransforms(bitmap, 0, 1, 0); // Resize green channel returnCode = resizeChannel(&(*bitmap).green, (*bitmap).greenWidth, (*bitmap).greenHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); return returnCode; } // Set green channel dimensions if ((*bitmap).greenWidth >= maxWidth && (*bitmap).greenHeight >= maxHeight) { (*bitmap).greenWidth = maxWidth; (*bitmap).greenHeight = maxHeight; } // Decode blue channel returnCode = decodeJpegChannel(jpegData, jpegSize, 2, &(*bitmap).blue, &(*bitmap).blueWidth, &(*bitmap).blueHeight); if (returnCode != MEMORY_OK) { LOGE("Failed to decode blue channel"); njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } doTransforms(bitmap, 0, 0, 1); // Resize blue channel returnCode = resizeChannel(&(*bitmap).blue, (*bitmap).blueWidth, (*bitmap).blueHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } // Set blue channel dimensions if ((*bitmap).blueWidth >= maxWidth && (*bitmap).blueHeight >= maxHeight) { (*bitmap).blueWidth = maxWidth; (*bitmap).blueHeight = maxHeight; } // Set the final bitmap dimensions if ((*bitmap).redWidth == (*bitmap).greenWidth && (*bitmap).redWidth == (*bitmap).blueWidth && (*bitmap).redHeight == (*bitmap).greenHeight && (*bitmap).redHeight == (*bitmap).blueHeight) { (*bitmap).width = (*bitmap).redWidth; (*bitmap).height = (*bitmap).redHeight; } else { njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return INCONSISTENT_BITMAP_ERROR; } njDoneLeaveRGBData(); return MEMORY_OK; }
int decodeResizeImage(char const *filename, int maxPixels, Bitmap* bitmap) { LOGI("decodeResizeImage. START"); int returnCode; int maxWidth; int maxHeight; // Decode Image returnCode = decodeImage(filename, bitmap); if (returnCode != MEMORY_OK) { LOGE("Failed to decode image"); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } LOGI("decodeResizeImage. IMAGE DECODED"); doTransforms(bitmap, 1, 0, 0); // Resize red channel getScaledSize((*bitmap).redWidth, (*bitmap).redHeight, maxPixels, &maxWidth, &maxHeight); //We only need to do this once as r, g, b should be the same sizes returnCode = resizeChannel(&(*bitmap).red, (*bitmap).redWidth, (*bitmap).redHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { freeUnsignedCharArray(&(*bitmap).red); return returnCode; } // Set red channel dimensions if ((*bitmap).redWidth >= maxWidth && (*bitmap).redHeight >= maxHeight) { (*bitmap).redWidth = maxWidth; (*bitmap).redHeight = maxHeight; } LOGI("decodeResizeImage. RED COMPLETE"); /** * GREEN CHANNEL */ doTransforms(bitmap, 0, 1, 0); // Resize green channel returnCode = resizeChannel(&(*bitmap).green, (*bitmap).greenWidth, (*bitmap).greenHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); return returnCode; } // Set green channel dimensions if ((*bitmap).greenWidth >= maxWidth && (*bitmap).greenHeight >= maxHeight) { (*bitmap).greenWidth = maxWidth; (*bitmap).greenHeight = maxHeight; } LOGI("decodeResizeImage. GREEN COMPLETE"); /** * BLUE CHANNEL */ doTransforms(bitmap, 0, 0, 1); // Resize blue channel returnCode = resizeChannel(&(*bitmap).blue, (*bitmap).blueWidth, (*bitmap).blueHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } // Set blue channel dimensions if ((*bitmap).blueWidth >= maxWidth && (*bitmap).blueHeight >= maxHeight) { (*bitmap).blueWidth = maxWidth; (*bitmap).blueHeight = maxHeight; } LOGI("decodeResizeImage. BLUE COMPLETE"); // Set the final bitmap dimensions if ((*bitmap).redWidth == (*bitmap).greenWidth && (*bitmap).redWidth == (*bitmap).blueWidth && (*bitmap).redHeight == (*bitmap).greenHeight && (*bitmap).redHeight == (*bitmap).blueHeight) { (*bitmap).width = (*bitmap).redWidth; (*bitmap).height = (*bitmap).redHeight; } else { freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return INCONSISTENT_BITMAP_ERROR; } LOGI("decodeResizeImage. FINISHED"); return MEMORY_OK; }