Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > XSetForeground - задать


Автор: Rickert 6.12.2007, 12:04
САБЖовая функция принимает третьим параметром цвет пикселя. Вопрос: как из RGB получить это unsigned long значение?

Автор: bsa 6.12.2007, 18:46
Код
union color {
      struct {
              unsigned char r, g, b, a;//иногда, порядок может быть другим
      };
      unsigned long index;
};

Автор: Rickert 7.12.2007, 07:46
Э... И?

Автор: Rickert 7.12.2007, 09:14
Нет, я конечно понимаю смысл, что указываешь в rgba, а он тебе потом просто через unsigned long это выдаёт
Типа:
Цитата
red = 59
green = f3
blue = b6

В результате, если обратиться к index, то у него будет:
Цитата
0059f3b6

Я так и делаю, только смещением и побитовым или и результат идентичен, а отображает она каритнку всё равно криво, как будто цветов не хватает.

Добавлено через 6 минут и 5 секунд
Смотри скрин. В браузере открыта картинка, как должна быть, а на верху, в впрограмме, как отображается.

Автор: bsa 7.12.2007, 12:07
Вот здесь есть пример: http://www.xmission.com/~georgeps/documentation/tutorials/Xlib_Beginner.html

Автор: Rickert 11.12.2007, 08:16
Да, всё вроде то, но вопрос такой:
Код

XParseColor(dis, colormap, green, &green_col);
XAllocColor(dis, colormap, &green_col);

Т.к. у меня картинка 1024х200 - она обрабатывает её очень долго из - за второй функции. Как сузить время получения цвета?

Автор: Rickert 11.12.2007, 08:32
Разобрался как он цвета кодирует, так что эти функции не в счёт.
Ошибка с выводом видимо в библиотеки libpng или я как-то неверно юзаю функции для открытия файла. Буду искать ошибку.

Автор: MAKCim 11.12.2007, 10:37
Цитата(Rickert @  11.12.2007,  08:32 Найти цитируемый пост)
Ошибка с выводом видимо в библиотеки libpng

совет, ругать библиотеку надо в самом последнем случае  smile 
в 99% случаев виновата не она

Автор: Rickert 12.12.2007, 12:07
MAKCim, да я всё это прекрасно понимаю, но не вижу никаких ошибок у себя. Несколько разных мануалов просмотрел - всё так должно быть. Вот, исходники.
Класс:
Код
class aPng
{
  public:
    aPng();
      bool apLoadImage(char* path);
      void apClearData();
    ~aPng();
    
    int bpc;
    int w;
    int h;
    int channels;
    unsigned char* data;
    int ct;
    int it;
    int cot;
    int ft;
    int depth;
    int rowSize;
    Pixmap pm;
};

Код
bool aPng::apLoadImage(char* path)
{
  if (!path)
   return 0;
   
  FILE* file = fopen(path, "rb");
  
  if (!file)
  {
    fprintf(stderr, "Can't open image file for reading \"%s\".\n", path);
    
    return 0;
  }

  png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
  png_infop pngInfo = png_create_info_struct(png);
  
  png_init_io(png, file);
  png_read_info(png, pngInfo);
  png_get_IHDR(png, pngInfo, (png_uint_32*)&w, (png_uint_32*)&h, &bpc, &ct, &it, &cot, &ft);
  if (ct == PNG_COLOR_TYPE_GRAY)
    channels = 1;
  if (ct == PNG_COLOR_TYPE_GRAY_ALPHA)
    channels = 2;
  if (ct == PNG_COLOR_TYPE_RGB)
    channels = 3;
  if (ct == PNG_COLOR_TYPE_RGB_ALPHA)
    channels = 4;
  if (bpc == 16)
    png_set_swap(png);
  if ((ct == PNG_COLOR_TYPE_PALETTE) && (bpc <= 8))
    png_set_palette_to_rgb(png);
  if (png_get_valid(png, pngInfo, PNG_INFO_tRNS))
    png_set_tRNS_to_alpha(png);
  rowSize = w*channels*(bpc >> 3);
  
  int i;
  data = new unsigned char[h*rowSize];
  unsigned char* row = data;
  
  for (i = 0; i < h; ++i)
  {
    png_read_row(png, (png_bytep)row, 0);
    row += rowSize;
  }
  png_read_end(png, 0);
  png_destroy_read_struct(&png, &pngInfo, 0);
  
  fclose(file);

  return 1;
}
 
Естественно это самый простой код, направленный на то чтобы только попробовать открыть и вывести картинку.

Добавлено через 2 минуты и 32 секунды
Где-то в мануалах упоминалось мол изначально окна не мог юзать больше 256 цветов. Может в этом дело?

Автор: Rickert 17.12.2007, 11:10
Решение в том, что как-то надо менять цветовую палитру Pixmap'а.
Короче, начал выводить прямо на экран  и проблема рассасалась

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)