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

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

ru
Offline Offline

« Ответ #30 : 08-12-2009 04:25 » 

Цитата
Быстрее будет просто очистить файл и записать туда без сравнивания
Конечно, быстрее  Улыбаюсь Но у меня это файл выступает, можно сказать, в качестве БД изображений, поэтому удАлять из него данные нИКак нельзя.
« Последнее редактирование: 08-12-2009 06:45 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #31 : 08-12-2009 04:29 » 

а ты где-то сказал, что нужно только часть файла перезаписать ? )
Ну ещё вариант - в специальной папке хранить набор файлов с говорящими названиями
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #32 : 08-12-2009 04:45 » 

Цитата
а ты где-то сказал, что нужно только часть файла перезаписать ? )
Не перезаписать, а дописать, если такого массива в txt файле нет Улыбаюсь

Цитата
в специальной папке хранить набор файлов с говорящими названиями
Ну это, как бы, тоже вариант, но придется каждый файл открывать, чтОБы сравнить массив изображения с txt файлом, не долго ли?
« Последнее редактирование: 08-12-2009 06:46 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #33 : 08-12-2009 05:03 » 

так тогда сравнивать и не нужно - записал , затерев предыдущее содержимое файла, да и всё
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #34 : 08-12-2009 05:36 » 

Цитата
так тогда сравнивать и не нужно - записал , затерев предыдущее содержимое файла, да и всё
Нельзя так делать.

Вот, имеется txt файл, если он пуст, записываем массив загруженного bmp изображения.
Если он не пуст, проверяем совпадает ли массив изображения с содержимым txt файла, если не совпадает, дописываем файл, если совпадает, выводим результат, стоящий на следующей строке после ( : ).

Пусть M - массив изображения
Файл пустой
M=0100010111
Записываю М в файл
Файл примет вид:
0100010111
:5 - где "5" это название изображения
Файл не пустой, произвожу сравнение если совпало
вывожу 5 на экран

Загружаю другой bmp файл с другим изображением.
Провожу те же операции.
И, таким образом, txt файл должен постоянно пополняться, в общем, должен содержать базу, необходимую для распознания изображений.

А если я буду постоянно затИрать файл, то что это это за база-то получится Улыбаюсь
« Последнее редактирование: 08-12-2009 06:48 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #35 : 08-12-2009 05:49 » 

да всё нормально:
имеется папка "изображения".

В ней файлы "5","вид из окна", "10"

нужно перезаписать файл "5" - открываем
Код:
HANDLE CreateFile("изображения\\5.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
- файл автоматом очистится или создастся, если ещё нет файла. И записываем
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #36 : 08-12-2009 06:00 » 

Что-то не совсем понимаю, для чего файл очищать? И еще, названия изображений может повторятся, меняться будет только вид матрицы изображения.
Т.е. bmp с нарисованной пятеркой будет выглядеть так:
01111010000100001110000010000101110
:пять

1111100010001110000100011110
:пять

Я так понял в вашем случае файл 5.txt все равно придется дописывать, чтоб он принял вид:
01111010000100001110000010000101110

1111100010001110000100011110

Поэтому наверно все-таки надо остановиться на записи всех изображений в один txt файл?
« Последнее редактирование: 08-12-2009 06:06 от NAYGER » Записан
NAYGER
Участник

ru
Offline Offline

« Ответ #37 : 08-12-2009 06:37 » 

Этот вариант работает, если изображение состоит из 1 пикселя  Улыбаюсь
Код:
...
for(y=0;y<bmp.bmHeight;y++)
{
for(x=0;x<bmp.bmWidth;x++)
{

char *buffer = new char[(x + 2) * y + 1];
char *next = buffer;

*next = ::GetPixel(hdc, x, y) != 0 ? '0' : '1';
next++;
*next = 0;
//fputs(buffer, file);

while (fscanf(mFile, "%s\t:%s\t", f1, f2) == 2)
{
if (!strcmp(f1, buffer)) //посимвольное сравнение строк
{
UpdateData(true);        
S=f2;
UpdateData(false);
}
}
fclose(mFile);
}
}
...
Я же говорю, что buffer сохраняет и выводит по одному символу в файл, а не целиком строку.
buffer=1  - запись в txt
buffer=0  - запись в txt
buffer=1  - запись в txt
buffer=1  - запись в txt
и т.д.
А вот если бы он имел вид
buffer=1011 и т.д.   - запись в txt
то все бы работало как надо.

Как бы сделать чтоб buffer сохранял всю строку массива изображения и вынести его циклы for?
 
« Последнее редактирование: 08-12-2009 06:39 от NAYGER » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #38 : 08-12-2009 06:48 » 

да ничего не надо дописывать. А поменялось имя - переименуй файл ))

В общем, делай, как нравится.

а сравниваешь как ? По идее:

Код:
if(0==strcmp(f1, buffer))
{
  строки одинаковые
}
else
{
  строки разные
}
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #39 : 08-12-2009 06:56 » 

Ну да, только f1 это получается строка в файле, а buffer каждый раз содержит по 1 символу, вот и не получается правильного сравнения Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #40 : 08-12-2009 07:15 » 

вот я тебе и говорю - не проще ли разбить на отдельные файлы ? )) Или мудрить подобие базы данных.
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #41 : 08-12-2009 07:27 » 

Алексей1153++,  да фишка в том, что осталось только с buffer намудрить и все работать будет Улыбаюсь

Вот я и не знаю как вам легче и быстрее почь мне будет, если вы покажите как намудрить с buffer или если вы напишите свой вариант Улыбаюсь Улыбаюсь Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #42 : 08-12-2009 07:57 » 

да я на работе, нет времени разбираться. Это ж надо проецировать файл, потом обеспечивать вставку новых данных в середину файла. Да и мало ли что ещё всплывёт ))
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #43 : 08-12-2009 08:06 » 

Во-во, а я про что говорю. Приходится работать с тем, что есть.

Может, если попробовать как-то
Код:
char *buffer = new char[(x + 2) * y + 1];
char *next = buffer;
вынести перед for, то произойдет чудо Улыбаюсь Хотя маловероятно.
Код:
...
for(y=0;y<bmp.bmHeight;y++)
{
for(x=0;x<bmp.bmWidth;x++)
{
char *buffer = new char[(x + 2) * y + 1];
char *next = buffer;
...

« Последнее редактирование: 08-12-2009 08:23 от NAYGER » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #44 : 08-12-2009 08:33 » 

а почему именно x+2 ?

попробуй так
Код:
DWORD dwdBufLen=bmp.bmHeight*bmp.bmWidth;
char* buffer = new char[dwdBufLen+1];//+1 для zt
::memset(buffer,0,dwdBufLen+1);//zt не забываем обнулить!!!

char* buffer_current=buffer;
for(y=0;y<bmp.bmHeight;y++)
{
for(x=0;x<bmp.bmWidth;x++)
{
*buffer_current=<символ>;
buffer_current++;
}
}
buffer_current=0;

//запись буфера
...

//удаление
delete [] buffer;
buffer=0;
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #45 : 08-12-2009 09:05 » 

Код:
DWORD dwdBufLen=bmp.bmHeight*bmp.bmWidth;
char* buffer = new char[dwdBufLen+1];//+1 для zt
::memset(buffer,0,dwdBufLen+1);//zt не забываем обнулить!!!

char* buffer_current=buffer;
for(y=0;y<bmp.bmHeight;y++)
{
for(x=0;x<bmp.bmWidth;x++)
{
*buffer_current=::GetPixel(hdc, x, y) != 0 ? '0' : '1';
buffer_current++;
}
}
buffer_current=0;

while (fscanf(mFile, "s\t:%s\t", f1, f2) == 2)
{
if (0==strcmp(f1, buffer)) //посимвольное сравнение строк
{
UpdateData(true);        
S=f2;
UpdateData(false);
}
}
fclose(mFile);

//удаление
delete [] buffer;
buffer=0;
При таком виде, запись в файл проходит, правильно.

Да что такое, спасибо Алексей1153++, buffer стал заполняться как надо, но не хочит строка сравниваться и все.

Код для сравнения, работает, а при связи с вышеописанным кодом поле static ничего не выводит:
Код:
FILE *mFile;
char f1[10000], f2[10000];
char patt[10000]= "01011001001001001000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000001111111111111111111111111111110000
0000000000000000000000000000011111111111111111111111111111111111111111000000
00000000000000000000000000000000000000000000000000001";
mFile = fopen ("file.txt","r");
//if (0==(mFile = fopen("file.txt", "r")))
//return 1;
if( mFile != 0 )
{    
while (fscanf(ifp, "%s\n:%s\n", f1, f2) == 2)
{
if (0==strcmp(f1, patt)) //посимвольное сравнение строк
{
UpdateData(true);        
S=f2;
UpdateData(false);
}
}
}
fclose(mFile);
}

« Последнее редактирование: 08-12-2009 09:46 от NAYGER » Записан
NAYGER
Участник

ru
Offline Offline

« Ответ #46 : 08-12-2009 10:14 » 

Заметил такую штуку, если забанить всю программу и оставаить:
Код:
void CMyDlg::OnButton1() 
{
}
потом помесьтить сюда, код для сравнения см.выше, то на экран ничего не выводится  Не понял.
Хотя в отдельно созданной программе все работает как надо.
Попробую по новой проект пересоздать ...
« Последнее редактирование: 08-12-2009 10:17 от NAYGER » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #47 : 08-12-2009 10:18 » 

а ты в отладчике уже остановился на строке
if(0==strcmp(...
и посмотрел, ЧТО в этот момент находится в строках ? Улыбаюсь
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #48 : 08-12-2009 10:36 » 

В общем если в оригинале смотреть Build->Start debug->Run to Cursor то там много всего выводится и в итоге результат правильный.

А если смотреть в этой программе, то ничего не выводится кроме:
Name:This   Value:CXX0017: Error: symbol "this" not found

Даже сказал бы, что вообще ничего.

P.S. - может исходник скинуть?
« Последнее редактирование: 08-12-2009 10:44 от NAYGER » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #49 : 08-12-2009 10:48 » 

я запутался - какой "оригинал" , какая "эта программа" ? )) При чём тут this , совсем загадочно

Исходник прицепи к посту

Какая среда разработки, кстати ?
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #50 : 08-12-2009 11:02 » 

Среда - Visual C++.

* 1.rar (54.99 Кб - загружено 749 раз.)
Записан
Джон
просто
Администратор

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

« Ответ #51 : 08-12-2009 11:10 » 

Жестоко. Жаль

Лёш, проект сделан в твоей любимой шохе. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #52 : 08-12-2009 11:33 » 

NAYGER, какой проект смотреть - "Файл" или "Распознавание" ?
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #53 : 08-12-2009 11:50 » 

Распознавание
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #54 : 08-12-2009 12:07 » 

поясни, что должно происходить вот в этой строчке

fscanf(mFile, "s\t:%s\t", f1, f2)

потому что я никогда этой функцией не пользовался.

и точно ли тут "s" в начале, а не "%s"

В общем, вертает она у тебя -1 , в цикл не заходим вообще
Записан

NAYGER
Участник

ru
Offline Offline

« Ответ #55 : 08-12-2009 13:28 » 

Цитата
поясни, что должно происходить вот в этой строчке
fscanf(mFile, "s\t:%s\t", f1, f2)
Эту функцию в нете нашел и она работает Улыбаюсь
Я же там специально второй проект прикрепил, чтоб вы глянули, как работает та часть программы отвечающая за поиск в файле, и вывод на экран.
f1 - это получается первая строка с которой производится сравнение, а f2 - это строка в которой после знака ( : ), стоит значение которое выводится на экран.

Цитата
потому что я никогда этой функцией не пользовался.
Ну если предложешь свой вариант, я буду не против, главное чтоб он работал как надо   Ага

Цитата
и точно ли тут "s" в начале, а не "%s"
Да, извеняюсь тут будет не "s", а "%s" .
Записан
NAYGER
Участник

ru
Offline Offline

« Ответ #56 : 08-12-2009 13:37 » new

Все заработало!!!  Жжешь

Алексей1153++, респепектищище тебе  Отлично

Цитата
и точно ли тут "s" в начале, а не "%s"
Из-за не поставленного "%" не работала прога.

Все пойду спать Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #57 : 08-12-2009 15:15 » 

Цитата
Ну если предложешь свой вариант, я буду не против
я привык апишными функциями файл доставать ))

CreateFile - открыть/создать
WriteFile/WriteFileEx - записать в файл
ReadFile/ReadFileEx - читать из файла
SetFilePointer/SetFilePointerEx - установить указатель в файле
Записан

yudjin
Помогающий

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

« Ответ #58 : 28-05-2010 05:53 » 

Раз тема зашла о файлах - SetFilePointer/SetFilePointerEx - установить указатель в файле.
у CFile есть метод GetPosition() - позиция указателя в файле. Как что-то подобное узнать, если работаешь с дескриптором файла через АПИ??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #59 : 28-05-2010 06:08 » 

наверное, так проканает )

DWORD CurrPtr= SetFilePointer(hFile,0,0,FILE_CURRENT);
Записан

Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines