2015-10-01 5 views
1

Во время процесса кодирования с кодировщиком x265 (https://x265.readthedocs.org/en/default/api.html) Я хочу записать значения пикселов изображения (в частности, значения Y-канала) в .txt-файл после кодирования нового изображения (не важно почему). Для этого я использую переменную 'Planes' класса x265_picture:x265 Encoder: порядок значений в массиве 'плоскостей'

x265_picture* pic_out; # variable where encoded image is to be stored 
... # encoding process 
uint8_t *plane = (uint8_t*)pic_out->planes[0]; 
uint32_t pixelCount = x265_picturePlaneSize(pic_out->colorSpace, m_param->sourceWidth, m_param->sourceHeight, 0); 
ofstream out_file("out_file.txt"); 

for (uint32_t j = 0; j < pixelCount; j++) # loop for all pixels 
{ 
    int pix_val = plane[j]; 
    out << pix_val; 
} 

ofstream.close() 

Но когда я восстановить выходные данные в образ, я получаю

enter image description here

вместо

enter image description here

или другой пример:

enter image description here

вместо

enter image description here

(цвет не важен, «полоса» является концерном)

В выходном файле существует, кажется, интервалы данных в (по-видимому) правильный порядок (скажем, 89,90,102,98, ...), за которым следует всегда длинная последовательность равных чисел (например. 235,235,235,235 ... или 65,65,65,65 ...), которые «создают» полосы. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает?

+0

Где вы получаете функцию x265_picturePlaneSize? Я не вижу его в заголовке. – Pescolly

+0

не использовали это некоторое время, но он находится в x265/source/common/common.cpp – user2208392

+0

его определение: uint32_t x265_picturePlaneSize (int csp, int width, int height, int plane) { uint32_t size = (uint32_t) (ширина >> x265_cli_csps [csp] .width [plane]) * (высота >> x265_cli_csps [csp] .height [plane]); размер возврата; } – user2208392

ответ

1

спасибо, ребята, просто решили это ... ключ используя 'Src + = srcStride':

ofstream out_file("out_file.txt"); 
int srcStride = pic_out->stride[0]/sizeof(pixel); 
uint8_t* src = (uint8_t*) pic_out->planes[0]; 

for (int y = 0; y < m_param->sourceHeight; y++, src += srcStride) 
{ 
    for (int x = 0; x < m_param->sourceWidth; x++) 
     out_file << (int)(src[x]) << ","; 
} 
out_file.close();