![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
исходник:
#include <conio.h> #include <stdio.h> #include <fcntl.h> #include <sys\stat.h> #include <io.h> #include <string.h> #include <ctype.h> #include <math.h> #include <graphics.h> unsigned long readnb(int handle,int from,int n) { int j=0; unsigned char c; unsigned long s=0; lseek(handle,from,SEEK_SET); do { read(handle,&c,1); s=s+c*pow(2,j*8); j++; }while(j<n); return(s); } int main(void) { int handle,i,bppixel,ctype,x=0,y=0; FILE *stream; unsigned char ch,r,g,b; unsigned long fsize,width,height,asize,aloc; int graphdriver=DETECT; int graphmode; initgraph(&graphdriver,&graphmode,"C:\\TC\\BGI"); clrscr(); if ((handle=open("D:\\work\\programs\\docs\\bmp\\untitled.bmp",O_RDONLY | O_BINARY))==-1) { perror("Error"); } stream=fdopen(handle,"r+"); fsize=readnb(handle,2,4); printf("Size: %lu\n",fsize); aloc=readnb(handle,10,4); printf("Array location: %lu\n",aloc); width=readnb(handle,18,4); printf("Width: %lu\n",width); height=readnb(handle,22,4); printf("Height: %lu\n",height); bppixel=readnb(handle,28,2); printf("Bit per pixel: %u\n",bppixel); ctype=readnb(handle,30,4); printf("Compression type: %u\n",ctype); asize=readnb(handle,34,4); printf("Array size: %lu\n",asize); getch(); lseek(handle,aloc,SEEK_SET); cleardevice(); y=height; do { read(handle,&r,1); read(handle,&g,1); read(handle,&b,1); putpixel(x,y,((r+g+b)/51)); x++; if (x==width) { x=0; y--; } //getch(); }while(!eof(handle)); fclose(stream); close(handle); getch(); closegraph(); } выводит исходный файл 800*600*24 со скоростью ~строка в секунду :( как ускорить процесс? |
|||
|
||||
Дрон |
|
||||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
По-моему, в любом случае у тебя всё упрётся в быстродействие putpixel.
Но кое-что можно улучшить: Вне main:
Внутри main:
И дальше вместо твоего:
Пишешь:
Будет работать, если ширина картинки в пикселях кратна BUFFSIZE. А выигрыш по быстродействию получается за счёт уменьшения числа обращений к файлу. Однако у меня при BUFFSIZE > 16 рост скорости прекращается из-за тормознутого putpixel. Можно поискать способ выводить на экран сразу порцию пикселей, но я с BGI почти не программировал, поэтому не знаю как. -------------------- Да. Именно так. |
||||||||
|
|||||||||
Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Плиз, выложи код целиком а то у меня не получается скомпилить.
|
|||
|
||||
Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Все спасибо я разобрался. Действительно существенно быстрее.
--------------------
Jah, help me! |
|||
|
||||
Graf Zeppelin |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 130 Регистрация: 28.3.2004 Репутация: нет Всего: 1 |
Можно сначала файл загнать в bitmap буфер а потом вставить putimage`ем но я тоже не знаю как это можно программно реализовать. --------------------
Jah, help me! |
|||
|
||||
cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Вопрос первый: тебе обязательно на 51 делить или тебя 64 тоже устроит? Если устроит то измени ту строку на
Вопрос второй: ты как в asm'e разбираешься? Если нормально то попробуй переписать тот кусок (см. выше) полностью на asm'e. При этом удерживай например теже r, g, и b в регистрах и не отпускай их ![]() Ну а вообще если ты сам не сделаешь функцию putpixel (ну или не разберешься с putimage), то больше ты особо ничего добиться не сможешь. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Вот тебе немного информации про putimage, а вообще я бы поискал где нибудь пример (работающий
![]() putimage -------------------------------------------------------------------------------- Syntax #include <graphics.h> void far putimage(int left, int top, void far *bitmap, int op); Description putimage puts the bit image previously saved with getimage back onto the screen, with the upper left corner of the image placed at (left,top). bitmap points to the area in memory where the source image is stored. The op parameter to putimage specifies a combination operator that controls how the color for each destination pixel onscreen is computed, based on the pixel already onscreen and the corresponding source pixel in memory. The enumeration putimage_ops, as defined in graphics.h, gives names to these operators. Name Value Description COPY_PUT 0 Copy XOR_PUT 1 Exclusive or OR_PUT 2 Inclusive or AND_PUT 3 And NOT_PUT 4 Copy the inverse of the source In other words, COPY_PUT copies the source bitmap image onto the screen, XOR_PUT XORs the source image with the image already onscreen, OR_PUT ORs the source image with that onscreen, and so on. Return Value None. Example
http://www.cs.colorado.edu/~main/manuals/bgi/putimage.html -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |