本文整理汇总了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;
}