C ++将BitMap“正确向上”读入1D向量的最佳方法

时间:2016-06-08 20:57:26

标签: c++ algorithm data-structures bitmap array-algorithms

我正在尝试将BitMap“正确的方法”读入1D向量。这是我的第一次尝试。它非常笨重:

void BitMap::ReadBMP(const char* filename)
{
    FILE* f = fopen(filename, "rb");
if(f == NULL)
    throw "Argument Exception";

unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header

// extract image height and width from header
m_width = *(int*)&info[18];
m_height = *(int*)&info[22];

cout << endl;
cout << "  Name: " << filename << endl;
cout << " Width: " << m_width << endl;
cout << "Height: " << m_height << endl;

int row_padded = (m_width*3 + 3) & (~3);
unsigned char* data = new unsigned char[row_padded];
unsigned char tmp;

std::deque<Element> mydeque;
std::vector<Element> bmpRow;

for(int i = 0; i < m_height; i++)
{
    fread(data, sizeof(unsigned char), row_padded, f);
    for(int j = 0; j < m_width*3; j += 3)
    {
                    // BGRA format
        Element element;
        element.Elements[0] = data[j+2];
        element.Elements[1] = data[j+1];
        element.Elements[2] = data[j];
        element.Elements[3] = 0; // for alpha
        bmpRow.push_back(element);
    }
    mydeque.insert (mydeque.begin(),bmpRow.begin(),bmpRow.end());
    bmpRow.clear();
}

std::copy(mydeque.begin(), mydeque.end(), std::back_inserter(m_pixelVec)); 
cout<< "After Deque Copy" << endl;

fclose(f);
delete data;

}

问题是,我需要在APP的不同点迭代数据 - 注意h和W交换为setPixel。 请忽略此部分,这只是为了演示BitMap需要在上面的C ++部分中旋转:

for (int h = 0; h<imageHeight; h++)
{
    for (int w = 0; w<imageWidth; w++)
    {
        int p = 0;
        Pixel pixel = currentImagePixelVec.get(pixelVecLoc);
        p = (pixel.Alpha<<24) | (pixel.Red<<16) | (pixel.Green<<8) | pixel.Blue;                
        imageData.setPixel(w, h, p);            
        pixelVecLoc++;
    }
}

所以当我将其读入1D Vector时,我想旋转BitMap。你能提出一个好方法吗?

修改 这实际上仅用于测试目的。我只使用BitMaps我知道高度和宽度等。我想从算法的角度来看,人们会怎么做

1 个答案:

答案 0 :(得分:1)

据我了解,您想要转置图像数据;也就是说,将像素列存储在m_pixelVec的连续段中,而不是行。

在我看来,最简单的方法是在读取数据时将值放入2D数据结构中,然后展平它。这使得通过翻转索引来改变列主要与行主要顺序变得微不足道。

为了在我想要的时候访问任何一点,没有任何push_backs,我预先分配了整个事情,假设Element类型是默认构造的。我使用了矢量矢量,但2D阵列也可以正常工作。

我注意到你把第一行读(i == 0)放在向量的末尾,并假设你想保持这种行为。因此,在分配给<nav role="navigation" class="navbar navbar-default navbar-static-top"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" data-target="#navbarCollapse" data-toggle="collapse" class="navbar-toggle"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <!--<a href="#" class="navbar-brand">Logo</a>--> <a class="bgc hdr_hic" title="./" href="./">&nbsp;</a> </div> <!-- Collection of nav links, forms, and other content for toggling --> <div id="navbarCollapse" class="collapse navbar-collapse"> <?php wp_nav_menu( array( 'menu' => 'secondary', 'theme_location' => 'secondary', 'depth' => 2, 'container' => true, 'container_class' => 'collapse navbar-collapse', 'container_id' => 'bs-example-navbar-collapse-1', 'menu_class' => 'nav navbar-nav', 'fallback_cb' => 'wp_bootstrap_navwalker::fallback', 'walker' => new wp_bootstrap_navwalker()) ); ?> <!--<form role="search" class="navbar-form navbar-left"> <div class="form-group"> <!--<input type="text" placeholder="Search" class="form-control">--> <!--<div class="search-toggle">--> <!--<a href="#search-container" class="screen-reader-text" aria-expanded="false" aria-controls="search-container"><?php //_e( 'Search', 'twentyfourteen' ); ?></a>--> <!--</div>--> <!--</div>--> <!--</form>--> </div> </nav> <!-- its a secondary menu --> 时,索引m_height-i-1。 另一种可能性是使用bmpcolrow,然后在插入时反转列(在最后一行使用bmpcolrow[j][i]col.rbegin())。

col.rend()