当前位置: 首页>>代码示例>>C++>>正文


C++ ImageBase::getRawAddress方法代码示例

本文整理汇总了C++中ImageBase::getRawAddress方法的典型用法代码示例。如果您正苦于以下问题:C++ ImageBase::getRawAddress方法的具体用法?C++ ImageBase::getRawAddress怎么用?C++ ImageBase::getRawAddress使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在ImageBase的用法示例。


在下文中一共展示了ImageBase::getRawAddress方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: loadPng


//.........这里部分代码省略.........

	// libpng 内でエラーが発生した場合、ここに longjmp してくる
	if (setjmp(pPngStruct->jmpbuf)) {
		if (ppRowTable) delete[] ppRowTable;
		if (pImageBase) delete pImageBase;
		::png_destroy_read_struct(&pPngStruct, &pPngInfo, NULL);
		return false;
	}

	::png_init_io(pPngStruct, pFile);
	::png_set_sig_bytes(pPngStruct, numBytesSignature);
	::png_read_info(pPngStruct, pPngInfo);

	// 画像サイズ・ピクセル深度・カラータイプを取得
	png_uint_32 width = 0;
	png_uint_32 height = 0;
	int bit_depth = 0;
	int color_type = 0;
	::png_get_IHDR(pPngStruct, pPngInfo, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);

	bool hasTRNS = ::png_get_valid(pPngStruct, pPngInfo, PNG_INFO_tRNS) ? true : false;

	// 読み込み時に 8bit に変換するよう設定
	if (color_type == PNG_COLOR_TYPE_PALETTE ||
		(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) ||
		hasTRNS) {
		::png_set_expand(pPngStruct);
	}

	// Gray + Alpha、あるいは Gray + tRNS の時は RGBA に変換
	if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
		(color_type == PNG_COLOR_TYPE_GRAY && hasTRNS)) {
		::png_set_gray_to_rgb(pPngStruct);
	}

	// RGB の並びを BGR に変更
	if (color_type != PNG_COLOR_TYPE_GRAY) {
		::png_set_bgr(pPngStruct);
	}

	// 24bit なら後ろ α=255 を追加して 32bit に変換
	if (hasTRNS &&
		(color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_RGB)) {
		::png_set_filler(pPngStruct, 255, PNG_FILLER_AFTER);
	}

	// PNG ファイルのガンマ値を取得。なければ何もしない
	const double gammaLUT = 1.0f;
	const double gammaCRT = 2.2f;
	double display_exponent = gammaLUT * gammaCRT;
	double gammaFile = 0.0f;
	if (::png_get_gAMA(pPngStruct, pPngInfo, &gammaFile)) {
		::png_set_gamma(pPngStruct, display_exponent, gammaFile);
	}

	// 変換の設定を pPngInfo に反映
	::png_read_update_info(pPngStruct, pPngInfo);


	// 生成する画像の種類の判別
	ElementType typeElement = ELEMENT_UNKNOWN;
	ChannelType typeChannel = CHANNEL_UNKNOWN;

	if (bit_depth == 16) {
		::png_set_swap(pPngStruct);
		typeElement = ELEMENT_16;
	} else {
		typeElement = ELEMENT_8;
	}

	if (color_type == PNG_COLOR_TYPE_GRAY) {
		typeChannel = hasTRNS ? CHANNEL_RGBA : CHANNEL_GRAY;
	} else if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_RGB) {
		typeChannel = hasTRNS ? CHANNEL_RGBA : CHANNEL_RGB;
	} else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA || color_type == PNG_COLOR_TYPE_RGB_ALPHA) {
		typeChannel = CHANNEL_RGBA;
	}
	pImageBase = ImageFactory::createImage(width, height, typeElement, typeChannel);

	int sizeRowBytes = ::png_get_rowbytes(pPngStruct, pPngInfo);
	int sizeRowBytesImageBase = pImageBase->getNumBytesRow();

	// 各ラインの先頭アドレスをテーブルに入れておく
	ppRowTable = new png_byte*[height];
	for (unsigned int y = 0; y < height; y ++) {
		ppRowTable[y] = reinterpret_cast<png_byte*>(pImageBase->getRawAddress(0, y));
	}

	// PNG 画像読み込み
	::png_read_image(pPngStruct, ppRowTable);

	::png_read_end(pPngStruct, NULL);

	if (ppRowTable) delete[] ppRowTable;
	::png_destroy_read_struct(&pPngStruct, &pPngInfo, NULL);

	*ppImage = pImageBase;

	return true;
}
开发者ID:tomotaco,项目名称:tacoworksImageLib,代码行数:101,代码来源:PngFile.cpp


注:本文中的ImageBase::getRawAddress方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。