рисунок не принимает пиксель

152
14 ноября 2018, 10:10

ошибка в строке

img[i].out[y][x] = pixel;

Если писать без img[i] во всем коде, то out[y][x] должно нормально работать. Но мне нужна группа рисунков, поэтому я в структуру запихнул. Может ещё подскажете способ получше, ну как группой рисункой управлять, потому что массив не получиться, так как y и x тоже будут в массиве. Вот код.

#include <png++/png.hpp>
#include <cstdio>
#include <ctype.h>
#include <unistd.h>
#include <ftw.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
struct img {
    png::image < png::rgba_pixel > *out;
};
static void
convert ( const char *infile, const char *outdir, int hor )
{
    png::image< png::rgba_pixel > image ( infile );
    int height = image.get_height ( );
    int width = image.get_width ( );
    struct img img[hor];
    png::image < png::rgba_pixel > out[hor];
    for ( int i = 0; i < hor; i++ ) {
        img[i].out = new png::image< png::rgba_pixel > ( width / hor, height );
    }
    int slice = width / hor;
    int i = 0;
    for ( int y = 0; y < height; y++ ) {
        for ( int x = 0; x < width; x++ ) {
            if ( x % slice == 0 ) i++;
            png::rgba_pixel pixel = image[y][x];
            img[i].out[y][x] = pixel;
        }
        i = 0;
    }
    char buf[255];
    for ( int i = 0; i < hor; i++ ) {
        sprintf ( buf, "%s_%d.png", infile, i );
        img[i].out->write ( buf );
    }
}
// slice gcup.png outdir 4x0
int main ( int argc, char **argv )
{
    if ( argc < 3 ) return -1;
    if ( access ( argv[2], F_OK ) )  mkdir ( argv[2], 0755 ); 
    int hor = 6;
    convert ( argv[1], argv[2], hor );
}

И вот какая ошибка появляется.

c++ main.cpp `pkg-config --libs libpng --cflags libpng` -o slice
main.cpp: In function ‘void convert(const char*, const char*, int)’:
main.cpp:32:23: error: no match for ‘operator=’ (operand types are ‘png::basic_pixel_buffer<png::basic_rgba_pixel<unsigned char>, std::vector<png::basic_rgba_pixel<unsigned char>, std::allocator<png::basic_rgba_pixel<unsigned char> > >, png::row_traits<std::vector<png::basic_rgba_pixel<unsigned char>, std::allocator<png::basic_rgba_pixel<unsigned char> > > > >::row_type {aka std::vector<png::basic_rgba_pixel<unsigned char>, std::allocator<png::basic_rgba_pixel<unsigned char> > >}’ and ‘png::rgba_pixel {aka png::basic_rgba_pixel<unsigned char>}’)
    img[i].out[y][x] = pixel;
                       ^~~~~
In file included from /usr/include/c++/7/vector:69:0,
                 from /usr/include/png++/palette.hpp:34,
                 from /usr/include/png++/png.hpp:40,
                 from main.cpp:1:
/usr/include/c++/7/bits/vector.tcc:179:5: note: candidate: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = png::basic_rgba_pixel<unsigned char>; _Alloc = std::allocator<png::basic_rgba_pixel<unsigned char> >]
     vector<_Tp, _Alloc>::
     ^~~~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/vector.tcc:179:5: note:   no known conversion for argument 1 from ‘png::rgba_pixel {aka png::basic_rgba_pixel<unsigned char>}’ to ‘const std::vector<png::basic_rgba_pixel<unsigned char>, std::allocator<png::basic_rgba_pixel<unsigned char> > >&’
In file included from /usr/include/c++/7/vector:64:0,
                 from /usr/include/png++/palette.hpp:34,
                 from /usr/include/png++/png.hpp:40,
                 from main.cpp:1:
/usr/include/c++/7/bits/stl_vector.h:461:7: note: candidate: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::vector<_Tp, _Alloc>&&) [with _Tp = png::basic_rgba_pixel<unsigned char>; _Alloc = std::allocator<png::basic_rgba_pixel<unsigned char> >]
       operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())
       ^~~~~~~~
/usr/include/c++/7/bits/stl_vector.h:461:7: note:   no known conversion for argument 1 from ‘png::rgba_pixel {aka png::basic_rgba_pixel<unsigned char>}’ to ‘std::vector<png::basic_rgba_pixel<unsigned char>, std::allocator<png::basic_rgba_pixel<unsigned char> > >&&’
/usr/include/c++/7/bits/stl_vector.h:482:7: note: candidate: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::initializer_list<_Tp>) [with _Tp = png::basic_rgba_pixel<unsigned char>; _Alloc = std::allocator<png::basic_rgba_pixel<unsigned char> >]
       operator=(initializer_list<value_type> __l)
       ^~~~~~~~
/usr/include/c++/7/bits/stl_vector.h:482:7: note:   no known conversion for argument 1 from ‘png::rgba_pixel {aka png::basic_rgba_pixel<unsigned char>}’ to ‘std::initializer_list<png::basic_rgba_pixel<unsigned char> >’
makefile:3: recipe for target 'all' failed
make: *** [all] Error 1
READ ALSO
C++ неявное приведение типов

C++ неявное приведение типов

подскажите пожалуйста, как в компилятор С++ разрешает проблему неявного привидения типовВ частности интересует вопрос: почему в первом случае...

292
Что из себя представляет null?

Что из себя представляет null?

Нет такого типа, которому бы соответствовал instanceof от null

144
Используя Regex удалить всё, кроме того, что подходит под паттерн

Используя Regex удалить всё, кроме того, что подходит под паттерн

Собственно вопрос в том, как реализовать код который из string будет выбирать только ту часть, что удовлетворяет условиям, а всё остальное удалятьВ...

136
Почему isInterrupted() не меняет свое значение?

Почему isInterrupted() не меняет свое значение?

Решил проверить срабатывание isInterrupted() следующим кодом:

157