Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3] 4  Все   Вниз
  Печать  
Автор Тема: Избавится от циклов при рисовании картинки в Qt  (Прочитано 87041 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #60 : 24-05-2013 07:04 » 

))) я эту папку всегда удаляю сразу, там только мусор Улыбаюсь Щас достану

Добавлено через 7 минут и 25 секунд:
с глобальными переменными жестяк, конечно, полный...

а по сути - QImage::fromData у тебя возвращает null

Добавлено через 1 минуту и 24 секунды:
думаю, массив нужно сначала привести к виду 24-битноцветного битмапа (BMP)

Добавлено через 12 минут и 40 секунд:
zuze, вот тебе пища для размышлений (времени у тебя вагон, как я понимаю) , разбирайся, задавай вопросы Улыбаюсь

(click to show)

* test.PNG (48.31 Кб - загружено 2044 раз.)
« Последнее редактирование: 24-05-2013 07:25 от Алексей1153 » Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #61 : 27-05-2013 07:28 » 

с глобальными переменными жестяк, конечно, полный...

Глобальные переменные это я на первое время для простоты.


думаю, массив нужно сначала привести к виду 24-битноцветного битмапа (BMP)

А не проще будет перевести QByteArray в uchar * и использовать "QImage::fromData (const uchar * data, int size, const char * format = 0)"?


Я сделал так:

Код:
//Глобально объявил

uchar *buffer;

После

Код:
b = MyOpenReadFile();

Добавил

Код:
buffer = (uchar *)b.data();
buffer = '\0';

А в место

Код:
im = QImage::fromData(b, 0);

Написал

Код:
im = QImage::fromData(buffer, 492*720,0);

Всё равно не рисуется. В чём же дело? На всякий случай прикрепляю проект.

* of5.rar (373.9 Кб - загружено 865 раз.)
« Последнее редактирование: 27-05-2013 08:07 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #62 : 27-05-2013 15:56 » 

нет, не проще. Проект я не буду смотреть , там ничего нового не увижу )

а скажи, кто формирует эти корявые исходные файлы-картинки ? Может быть, просто их вылечить до нормального формата  там, где они создаются ?
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #63 : 28-05-2013 04:50 » 

нет, не проще.

Всё понял, буду подготавливать QByteArray в нужную форму и если что спрашивать совета.

а скажи, кто формирует эти корявые исходные файлы-картинки ?

Эти файлы поставляются с выше.

Может быть, просто их вылечить до нормального формата  там, где они создаются ?

К сожалению это запрещено, по-каким причинам не знаю.

разбирайся, задавай вопросы Улыбаюсь

Код:
b = MyOpenReadFile();

QByteArray BMPFile;
BMPFile.resize(10);
BMPFile[0]  = 0x42;  // Тип файла
BMPFile[1]  = 0x4D;  // Тип файла
BMPFile[2]  = 0x35;  // Размер файла
BMPFile[3]  = 0x63;  // Размер файла
BMPFile[4]  = 0x52;  // Размер файла
BMPFile[5]  = 0x00;  // Зарезервированное место под байты равные 0x00
BMPFile[6]  = 0x00;  // Зарезервированное место под байты равные 0x00
BMPFile[7]  = 0x00;  // Зарезервированное место под байты равные 0x00
BMPFile[8]  = 0x00;  // Зарезервированное место под байты равные 0x00
BMPFile[9]  = 0x00;  // Зарезервированное место под байты равные 0x00
BMPFile[10] = 0x10; // Смещение

b.prepend(BMPFile);

Но что, то не рисуется. Наверно я неправильно заполнил BMPFile. Где там ошибка?

Заполняю QImage так:

Код:
im = QImage::fromData(b, 0);

Может тут в место "0" у второго параметра надо, чего-то другое вписывать?

Добавлено через 23 часа, 35 минут и 21 секунду:
У меня проблема с определением размера файла, где в формате BMP только красный цвет.
Я сделал его для примера, что бы понять принцип. С первыми двумя байтами всё понятно.

У меня Windows и редактор двоичных (бинарных) файлов показывает, что размер файла 1815058 байт, но в самом файле я вижу такие значения 0x12, 0xb2, 0x1b это получается 1817827 байт.

1. Откуда эти расхождения?
2. Если размер укладывается меньше чем в 4 байта, то остальные байты я должен сделать 0x00 (допустим, если у меня размер 0x12, 0xb2, то в файле размер должен указываться 0x12, 0xb2, 0x00, 0x00)?

Прикрепляю скриншёт с открытием файла в редакторе двоичных (бинарных) файлов.

* red_size.jpg (486.85 Кб - загружено 910 раз.)
« Последнее редактирование: 29-05-2013 06:55 от zuze » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #64 : 29-05-2013 07:31 » 

У меня Windows и редактор двоичных (бинарных) файлов показывает, что размер файла 1815058 байт, но в самом файле я вижу такие значения 0x12, 0xb2, 0x1b это получается 1817827 байт.

0x00 1b b2 12 == 1815058
Little endian
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #65 : 29-05-2013 07:43 » 

0x00 1b b2 12 == 1815058

Не понял ведь 0xb2 = 178, а 0x12 = 27, как это может равняться в итоге 1815058?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #66 : 29-05-2013 07:49 » 

zuze, калькулятор у тебя есть? Покалькулируй. И так у тебя 0x12 вдруг становится 27? Внимательность и еще раз внимательность! Little endian
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #67 : 29-05-2013 08:13 » 

и ещё момэнт есть: строки в BMP - составлены из 3-байтовых структур-пикселов, поэтому строка может оказаться размером, не кратным 4. Если это происходит, нужно дописать строку нулями до кратности.
Также, картинка в файле перевёрнута "вверх ногами"

на примере картинки вверху:


* Безымянный.PNG (5.88 Кб - загружено 1715 раз.)
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #68 : 29-05-2013 08:17 » 

И так у тебя 0x12 вдруг становится 27?

Это я ошибся я хотел написать, что 0x1b = 27, а это 0x12 = 18. Сейчас всё ещё лучше пересчитаю.
Всё понял надо было за раз и с право налево считать. Тогда совпадает. Большое спасибо!

Добавлено через 27 минут и 22 секунды:
Значит, если у меня файл размером 354 248 байт, то в файле будет записано 0x05 0x67 0xC8, а считаться с права налево. Я прав?
« Последнее редактирование: 29-05-2013 09:39 от zuze » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #69 : 29-05-2013 10:02 » 

Число: 0x000567C8
Байты:
  little endian: C8 67 05 00
  big endian: 00 05 67 C8

Процессоры x86 используют little endian (младший вперед). Для межплатформенных форматов часто используют «сетевой порядок байт», совпадающий с big endian (старший вперед).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #70 : 29-05-2013 10:12 » 

Число: 0x000567C8
Байты:
little endian: C8 67 05 00
big endian: 00 05 67 C8

Процессоры x86 используют little endian (младший вперед). Для межплатформенных форматов часто используют «сетевой порядок байт», совпадающий с big endian (старший вперед).

Тогда почему в файле размер файла, если указано меньше чем четыре байта, то 0x00 указываются в конце, а по Вашему они должны быть в начале. То есть если у "00 05 67 C8", то "00" должен быть в конце, а не в начале. Даже у "Алексей++" размер стоит "96 00 00 00", а не "00 00 00 96". Что-то может я опять не так понимаю?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #71 : 29-05-2013 10:53 » 

little_endian(96 00 00 00) -> 0x00000096
Неужели это сложно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #72 : 29-05-2013 10:57 » 

little_endian(96 00 00 00) -> 0x00000096
Неужели это сложно?

Я не в этом плане, я засомневался, что значения байт big endian 00 в начале, а не в конце, а так всё ясно.

Добавлено через 31 минуту и 58 секунд:
А как теперь вычислить значение "Смещение, с которого начинается само    изображение (растр). [Области данных]", которая 4 байта занимает?
« Последнее редактирование: 29-05-2013 11:29 от zuze » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #73 : 29-05-2013 13:22 » 

http://ru.wikipedia.org/wiki/BMP
Цитата
bfOffBits — содержит смещение в байтах от начала структуры BITMAPFILEHEADER до непосредственно битов изображения

Ты это читал? Что здесь непонятно?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #74 : 30-05-2013 04:43 » 

Что здесь непонятно?

Как до меня вчера не доходило, сегодня с утра сразу дошло - это значения количество байт перед байтами относящимися к самому изображению (то есть цвету).
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #75 : 30-05-2013 05:37 » 

Все просто. Надо лишь читать текст подряд, а не куда глаз упал. Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #76 : 30-05-2013 08:17 » 

Алексей++, у меня вопрос я вроде превратил QByteArray, но тоже ничего не рисуется. Наверно, что-то не так заполнил.

В конструкторе у меня так:

Код:
b = MyOpenReadFile();

QByteArray BMPFile;
BMPFile.resize(54);

BMPFile[0]  = 0x42; // Тип файла. Указывается "B"
BMPFile[1]  = 0x4D; // Тип файла. Указывается "M"

// Считать по little-endian - младший байт располагается в памяти по меньшему адресу
// Записывать по big-endian - старший байт располагается в памяти по меньшему адресу
// (354240 + 54 = 354294)
BMPFile[2]  = 0xF6; // Размер файла
BMPFile[3]  = 0x67; // Размер файла
BMPFile[4]  = 0x05; // Размер файла
BMPFile[5]  = 0x00; // Размер файла

BMPFile[6]  = 0x00; // Зарезервированное место под байты равные 0x00
BMPFile[7]  = 0x00; // Зарезервированное место под байты равные 0x00
BMPFile[8]  = 0x00; // Зарезервированное место под байты равные 0x00
BMPFile[9]  = 0x00; // Зарезервированное место под байты равные 0x00

// Количество байт до байт относящихся к картинки
BMPFile[10] = 0x36; // Смещение
BMPFile[11] = 0x00; // Смещение
BMPFile[12] = 0x00; // Смещение
BMPFile[13] = 0x00; // Смещение

// Длина заголовка равняется всегда 40 (0х28)
BMPFile[14] = 0x28;
BMPFile[15] = 0x00;
BMPFile[16] = 0x00;
BMPFile[17] = 0x00;

// Щирина изображения, пикселы (720 пикселов)
BMPFile[18] = 0x00;
BMPFile[19] = 0x2D;
BMPFile[20] = 0x00;
BMPFile[21] = 0x00;

// Высота изображения, пикселы (492 пикселов)
BMPFile[22] = 0xEC;
BMPFile[23] = 0x01;
BMPFile[24] = 0x00;
BMPFile[25] = 0x00;

// Количество плоскостей
BMPFile[26] = 0x00;
BMPFile[27] = 0x01;

// Количество бит на пиксель (24 бит)
BMPFile[28] = 0x18;
BMPFile[29] = 0x00;

// Тип сжатия (без сжатия)
BMPFile[30] = 0x00;
BMPFile[31] = 0x00;
BMPFile[32] = 0x00;
BMPFile[33] = 0x00;

// Размер изображения в байтах (492 * 720 = 354240)
BMPFile[34] = 0xC0;
BMPFile[35] = 0x67;
BMPFile[36] = 0x05;
BMPFile[37] = 0x00;

// Горизонтальное разрешение, точки на метр
BMPFile[38] = 0x00;
BMPFile[39] = 0x00;
BMPFile[40] = 0x00;
BMPFile[41] = 0x00;

// Вертикальное разрешение, точки на метр
BMPFile[42] = 0x00;
BMPFile[43] = 0x00;
BMPFile[44] = 0x00;
BMPFile[45] = 0x00;

// Число используемых цветов (0 - максимально возможное для данной глубины цвета)
BMPFile[46] = 0x00;
BMPFile[47] = 0x00;
BMPFile[48] = 0x00;
BMPFile[49] = 0x00;

// Число основных цветов
BMPFile[50] = 0x00;
BMPFile[51] = 0x00;
BMPFile[52] = 0x00;
BMPFile[53] = 0x00;

b.prepend(BMPFile);

Остальное всё по старому. Прикрепляю проект. На всякий случай файл 1.dat лежит в "of-build-desktop\file\".


* of.zip (452.14 Кб - загружено 890 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #77 : 30-05-2013 09:39 » 

zuze, я не компьютер ) Что мешает структуру заполнить ? Она уже объявлена
http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx

тебе до пикселов нужно расположить инфу в таком порядке:
BITMAPFILEHEADER
BITMAPINFOHEADER

Код:

int sizeofpix=354240;//размер массива пикселов

BITMAPFILEHEADER  fh={0};
BITMAPINFOHEADER ih={0};

fh.bfType=0x4D42;
fh.bfOffBits=sizeof(fh)+sizeof(ih);
fh.bfSize=sizeofpix + fh.bfOffBits

ih.biSize=sizeof(ih);
ih.biWidth=ШИРИНА_В_ПИКСЕЛАХ;;
ih.biHeight=ВЫСОТА_В_ПИКСЕЛАХ;
ih.biPlanes=1;
ih.biBitCount=24;
ih.biSizeImage=sizeofpix;


эти данные засовываешь перед пикселами. Не проверял, писал прямо здесь, разбирайся ) Возможно, что-то забыл указать
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #78 : 03-06-2013 07:10 » 

Алексей++, большое спасибо. Буду разбираться.

Не хотел новую тему создавать, решил проверить по скорости я этот алгоритм. Заранее перевести все файлы в bmp методом save()

Вот код (тут показано пока преобразование только одного файла):

Код:
// Глобальные
QImage im(720, 492, QImage::Format_ARGB32);
int buffer[492][720];
char NameFiles[670][13];
char NameFiles1[670][16];
int frame = 0;
int p = 0;

void of::paintEvent(QPaintEvent *)
{
       FILE *fp;
       int size = 0;

       if (frame == 0)
       {
          fp = fopen(NameFiles[frame], "rb");

          if (fp == NULL)
            qDebug() << "Cannot open file read!";

         fseek(fp, 0, SEEK_END);
         size = ftell(fp);
         fseek(fp, size - (492*720), SEEK_SET);

         for (int j = 0; j < 720; j++)
         {
             for (int i = 491; i >= 0; i--)
             {
                 buffer[i][j] = getc(fp);
                 im.setPixel(j, i, QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba());
             }
         }
         fclose(fp);

         strcat(NameFiles1[frame], NameFiles[frame]);
         strcat(NameFiles1[frame], ".bmp");
         qDebug() << NameFiles1[frame];

         QPainter painterRect(this);
         painterRect.setBrush(QBrush(Qt::black));
         painterRect.drawRect(50, 50, 720, 492);

         QPainter Tochka;
         Tochka.begin(this);

         Tochka.translate(50, 50);
         Tochka.drawImage(0, 0, im, 0, 0, 720, 492);

         Tochka.end();

         im.save(NameFiles1[frame], "BMP");
         frame = 1;
       }
}
// Массив имён файлов
void of::MyNameFile()
{
    struct _finddata_t f;
    long int hFile;
    int k = 0;
    chdir("file");
    hFile = _findfirst("*.dat", &f);
    int KolAllFile = hFile;

    while (KolAllFile != -1)
    {
        FILE *fp = fopen(f.name, "rb");

        if (fp == NULL)
           qDebug() << "Cannot open file read!";

        strcpy(NameFiles[k], f.name);
        k++;

        fclose(fp);
        KolAllFile = _findnext(hFile, &f);
    }
    _findclose(hFile);
    qDebug() << "OK";
}

Что странно, чёрный фон рисуется, но картинка не рисуется, а следовательно и в файле записывается мусор. В чём же дело?

Как я понял, не выводится из-за этого кода:

Фон чёрный рисуется, а вот сама картинка нет, выдаётся ошибка.
Ошибка такая:
QColor::setRgb: RGB parameters out of range
Invalid parameter passed to C runtime function.
« Последнее редактирование: 03-06-2013 11:36 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #79 : 03-06-2013 18:09 » 

могу предположить, что неправильно собираешь цвет

сохрани "новую BMP" картинку в файл и погляди дамп. Думаю, всё станет видно
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #80 : 10-06-2013 07:43 » 

Мне удалось все файлы перевести в BMP.
« Последнее редактирование: 10-06-2013 07:46 от zuze » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #81 : 10-06-2013 09:07 » 

хорошо
Записан

zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #82 : 18-06-2013 08:33 » 

Хочу немного отойти от BMP файлом и попробовать сделать, как будет меняться скорость рисования, если я поменяю метод setPixel на метод bits, а к BMP файлу я обязательно вернусь.

Вот код который был:

Код:
// Глобальные
int buffer[492][720];
QImage im1(720, 492, QImage::Format_ARGB32);

// В таймере
for (int j = 0; j < 720; j++)
{
     for (int i = 491; i >= 0; i--)
     {
          buffer[i][j] = getc(fp);
          im.setPixel(j, i, QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba());
      }
}

// В paintEvent
Tochka.drawImage(0, 0, im, 0, 0, static_cast<int>((2*this->MyRadianToGradus(phi))+0.5), 492);

Картинка прекрасно рисуется с каждым срабатыванием таймера всё больше и больше появляется картинка, пока она не появится полностью.

А вот на что я пытался заменить:

Код:
// Глобальные
int buffer[492][720];
QImage im1(720, 492, QImage::Format_ARGB32);

QRgb *ptr = reinterpret_cast<QRgb *>(im.bits());

// В таймере
for (int j = 0; j < 720; j++)
{
     for (int i = 491; i >= 0; i--)
     {
          buffer[i][j] = getc(fp);
          *(ptr++) = QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba();
      }
}

// В paintEvent
Tochka.drawImage(0, 0, im, 0, 0, static_cast<int>((2*this->MyRadianToGradus(phi))+0.5), 492);

В результате появляется только часть картинки (и в добавок не уверен что правильно, так как не вижу всю картинку), которая нарисовалась при первом срабатывании таймера, а при втором срабатывании таймера ни чего не рисуется, а программа зависает и выскакивает ошибка.
Ошибка такая:
D:\QtProject\l-build-desktop\debug\l.exe завершился с кодом -1073741819

Что не так я сделал?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #83 : 18-06-2013 08:46 » 

боюсь, что ты неправильно понимаешь метод bits
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #84 : 18-06-2013 09:14 » 

боюсь, что ты неправильно понимаешь метод bits

Он вроде указывает на начало указателя, а значит выполнятся будет быстрее, чем setPixel. Я хотел посмотреть как будет с методом bits скорость рисования происходить.
И вроде в интернете, есть какие-то примеры использования метода bits для рисования картинки.
Если я что-то не так понял поясните пожалуйста.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #85 : 18-06-2013 09:27 » 

да хрен его знает Жаль Я тупо читаю
Цитата
Returns a pointer to the first pixel data. This is equivalent to scanLine(0).

scanLine
Цитата
Returns a pointer to the pixel data at the scanline with index i. The first scanline is at index 0.

The scanline data is aligned on a 32-bit boundary.

Warning: If you are accessing 32-bpp image data, cast the returned pointer to QRgb* (QRgb has a 32-bit size) and use it to read/write the pixel value. You cannot use the uchar* pointer directly, because the pixel format depends on the byte order on the underlying platform. Use qRed(), qGreen(), qBlue(), and qAlpha() to access the pixels.

Т.е. scanline возвращает RGB структуру

Но это указатель на копию? изображения
Все равно затем этот "буфер" нужно "сбросить" на "дисплей"
« Последнее редактирование: 18-06-2013 09:30 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #86 : 18-06-2013 10:31 » 

Вообще, форматы пикселов могут быть самые разные. И дело тут не только в Big-Endian и Little-Endian, но и в количестве битов на цветовой канал, в порядке следования цветовых каналов, наличие и положение альфа-канала; наконец, бывают индексы палитры из заголовка, бывает одноканальный grayscale с разным количеством битов, и даже встречаются форматы YCbCr видеосигнала.

Так что попытка напрямую работать с битами уместна только в одном случае: если это BMP собственного производства - что записал, то и прочитал.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #87 : 18-06-2013 10:49 » 

Но это указатель на копию? изображения
Все равно затем этот "буфер" нужно "сбросить" на "дисплей"

Метод bits возвращает массив значений из которых состоит картинка.

Но это указатель на копию? изображения
Все равно затем этот "буфер" нужно "сбросить" на "дисплей"

Да конечно придётся рисовать на дисплей возможно с помощью циклов. Я только с помощью метода bits хотел избавится от метода setPixel и лично убедится с какой скоростью будет рисоваться.
Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #88 : 25-07-2013 11:38 » 

Прошу прощения, что так долго ничего не писал был занят.

Я вот сделал метод bits() в место метода setPixel() разница по времени не такая большая получается.

Если кому интересно вот так я сделал
метод setPixel()
Код:
QImage im(720, 492, QImage::Format_ARGB32);

for (int j = 0; j < 720; j++)
{
     for (int i = 491; i >= 0; i--)
     {
          buffer[i][j] = getc(fp);
          im.setPixel(j, i, QColor(buffer[i][j], buffer[i][j], buffer[i][j], 255).rgba());
     }
}

Метод bits()
Код:
QImage im(720, 492, QImage::Format_ARGB32);
QRgb *line = reinterpret_cast<QRgb *>(im.bits());

for (int j = 0; j < 720; j++)
{
          line = (QRgb*)im.bits() + 492*720 - 720 + j;
          for (int i = 491; i >= 0; i--)
          {
                    buffer[i][j] = getc(fp);
                    line = qRgb(buffer[i][j], buffer[i][j], buffer[i][j]);
                    line = line - 720;
          }
}

Разница между кодом, где во всех циклах был использован метод setPixel() и во всех циклах был использован метод bits() составило примерно 3 секунды. Метод bits() более быстрый, но не намного.

Теперь вплотную приступаю к формату BMP файла.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #89 : 25-07-2013 12:51 » 

а скажи-ка
line = (QRgb*)im.bits() + 492*720 - 720 + j;

(QRgb*)im.bits() - всегда возвратит одно и тоже?

Если это вычисляемая "константа" -  выноси ее за цикл.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: 1 2 [3] 4  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines