Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}