powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение изображения из файла
25 сообщений из 25, страница 1 из 1
Чтение изображения из файла
    #33653536
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как открыть файл изображения с помощью функции fopen, скопировать его в массив и иметь указатель на начало массива ?
Вопрос, возможно, примитивный.
Есть файловый манипулятор, но он указывает на файл.
Возможно ли так:
FILE *f=fopen("filepath","rw");
&handle=*f;
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33653549
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы переместить указатель текущей позиции файла в любое место, можно воспользоваться универсальным методом Seek. Он позволяет переместить указатель на определенное число байт относительно начала, конца или текущей позиции указателя.

Чтобы переместить указатель в начало или конец файла, наиболее удобно использовать специальные методы. Метод SeekToBegin перемещает указатель в начало файла, а метод SeekToEnd - в его конец.

Это как ?
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33653550
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то мне нужно открыть файл и скачать его в массив целых чисел, а там дальше все и ежику понятно.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33653551
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CFile f;
stroka10="d:\\vcpp\\matrix\\Data\\";
//MessageBox(stroka10);
stroka10=stroka10+stroka11;
//stroka=stroka+".matr";
//MessageBox(stroka10);
if(f.Open(stroka10,CFile::modeRead)==FALSE)
return;
CArchive ar(&f,CArchive::load);
nomer++;
ar>>s1; n[nomer]=atoi(s1);
ar>>s1; m[nomer]=atoi(s1);

strcat(as, stroka11);
int ii=0;
while (bs!='.')
{
bs=as[ii];
if (bs!='.') ss+=bs;
ii++;
};

nn=ss;
name[nomer]=ss;
//MessageBox(name[nomer]);
adres[nomer]=new float[n[nomer]*m[nomer]];
ptr=adres[nomer];
for(i=0; i<n[nomer]*m[nomer]; i++)
{
ar>>s ;
*ptr++=atof(s);
}
itoa(n[nomer],s2,10);
itoa(m[nomer],s3,10);
m_list5.AddString(name[nomer]+'('+s2+','+s3
+')');
m_list1.AddString(name[nomer]);
m_list3.AddString(name[nomer]);

*pResult = 0;

Вот такой вариант у меня был для чтения из файла матрицы.
Как переделать для чтения изображения ?
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33653604
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neskif Вот такой вариант у меня был для чтения из файла матрицы.
Как переделать для чтения изображения ?
Прочитал Холзнера и понял, что надо побаловаться функцией Seek, которая устанавливает позицию указателя в файле.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33654019
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CFile File("C:\\text\\file.txt",CFile::modeRead);
File.Seek(0,CFile::begin);
int col=File.GetLength();
int n=File.Read(BufferText,col);
m_Edit1.SetWindowText(BufferText);
File.Close();
Если у меня целые данные, то не обращать внимания, а просто потом результат преобразовать из текстового в целый тип ?
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33654040
crazydown
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
че вы усложняете все..
Вариант 1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
char *buffer;
FILE *f = fopen("file","rb");
if(f)
{
stat fstatus; //структура файла из SYS\STAT.H
fstat(f,&fstatus);
buffer = (char*)malloc(fstatus.st_size);
while(fread(buffer, 1 , 1024 ,f))
  buffer +=  1024 ;

fclose(f);
}

// ...
// do somthing with buffer
// ...

free(buffer);

Вариант 2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
HANDLE hFile,hHeap;
DWORD dwLowFileSize;
char* buffer;
hHeap = GetProcessHeap();

hFile = CreateFile("file", 0 , 0 ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile != INVALID_HANDLE_VALUE) 
{
dwLowFileSize = GetFileSize(hFile,NULL);
dwNumberOfBytesRead;
buffer = (char*)HeapAlloc(hHeap, 0 ,dwLowFileSize);
ReadFile(hFile,buffer,dwLowFileSize,&dwNumberOfBytesRead,NULL);
CloseHandle(hFile);
}


// ...
// do somthing with buffer
// ...

HeapFree(hHeap,buffer);
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33654189
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void CImageDlg::OnButton1()
{
char OutString [4][1];

CFile OutFile("d:\\a.dat",CFile::modeCreate| CFile::modeWrite);
for(int i=0; i<4; i++)
OutFile.Write(OutString ,1);

CFile f; char InString[1];
if(f.Open("d:\\a.dat",CFile::modeRead)==FALSE)
return;
for( i=0; i<4; i++)
{
f.Seek(i*1,CFile::begin);
int NumberCharacters=f.Read(InString,1);
m_edit1=CString(InString);

}
UpdateData(false);
f.Close;
}
Здесь пока нет преобразования текста в целые, но это не принципиально. Кроме этого я ничего в файл пока не записал, а также в OutString.
Осталось уже немного.
Что скажете ?
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33654410
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void CImageDlg::OnButton1()
{
char InString[9],as[9]={0}; int a;
CFile f;
if(f.Open("d:\\a.txt",CFile::modeRead)==FALSE)
return;
f.Read(InString,9);
strcat(as, InString);
a=f.GetLength();
//MessageBox(as);
//m_edit1=as[1];
m_edit1=a;
UpdateData(false);
}
Остановился пока на этом варианте. Далее буду разбираться с форматом читаемого изображения.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33654762
_shumer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж... neskif (sarmat =) ) разбирайся =)
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33654910
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_shumerДа уж... neskif (sarmat =) ) разбирайся =)
Ну и чего ты по форумам скачешь ? Почитай в йоге раздел "Здоровье" и научись быть спокойным. Ищешь себе проблемы по мелочам. Так всю жизнь на мелочевку и растратишь.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33665877
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С чтением разобрался. Теперь меня интересует программирование видеоадаптера SVGA в Visual C++ с ассемблерными вставками. Пожалуйста хотя бы немного сориентируйте. Полагаю, что в Kernel есть какие-то функции для этого.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33665985
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neskif, я с тебя тащщщщщщусь!
Ну какой может быть SVGA и kernel??? Это же соврешенно разные уровни.
Если хочешь программировать SVGA - забудь о кернеле, если хочешь использовать функции кернела - забудь про SVGA.

Если тебе нужен прямой доступ к видеоадптеру, то во первых, ищи описание своего адаптера. Там будет список портов и адресов записывая в которые ты и сможешь управлять видео. Но учти что для каждого видеоадаптера эти порты и адреса будут разными. И во вторых, тебя ОС не пустить этой фигней заниматься. Если конечно ты не оформишь свою программку в виде драйвера :)

А если ты хочешь всего-лишь вывести картинку в окошке или на весь экран - возьми лучше какую-нибудь графическую библиотеку. DirectX, GDI или хотя бы SDL и используй функции из этой библиотеки. Но забудь про ассемблер и SVGA.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33666732
Absurd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
neskif neskif Вот такой вариант у меня был для чтения из файла матрицы.
Как переделать для чтения изображения ?
Прочитал Холзнера и понял, что надо побаловаться функцией Seek, которая устанавливает позицию указателя в файле.
Формат BMP (речь видимо о нем) линейный и не требует Seek(). Сначала считываешь однодним вызовом ReadFile() BITMAPFILEHEADER путем передачи туда указателя на экземпляр данной скруктуры и ее длины (sizeof(BITMAPFILEHEADER)). О выравниваниии тут можно не беспокоиться - структуры win32 выровнены изначально. Затем - BITMAPINFOHEADER так же. Проанализировав BITMAPINFOHEADER можно выяснить, какой размер памяти выделить под палитру и надо ли еее выделять вообще. Под TrueColor - не надо. Если надо - считываешь массив RGBQUAD[] размера известного из BITMAPINFOHEADER. Затем выделяешь большой массив памяти под само изображение и считываешь туда его путем единственного вызова ReadFile().
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33667357
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Absurd

A> Затем выделяешь большой массив памяти под само изображение и
A> считываешь туда его путем единственного вызова ReadFile().

А почему бы не сделать все это же самое с помощью CreateFileMapping + MapViewOfFile ? Тогда вобще ничего читать не надо

---------------------
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33667696
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас Absurd

A> Затем выделяешь большой массив памяти под само изображение и
A> считываешь туда его путем единственного вызова ReadFile().

А почему бы не сделать все это же самое с помощью CreateFileMapping + MapViewOfFile ? Тогда вобще ничего читать не надо

А что это даст? Простой битмап 600x800 пикселей можно прямо прочитать и в массив расположенный в куче.
С техниками обработки слайдов, отсканированных с разрешением в 26000 DPI для полиграфических нужд нужно поэкспериментировать. А работал с такими файлами по кусочкам и не жаловался. Файлмэппинг может быть тоже хорош, не пробовал.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33669231
latex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Absurd

ты говорил о формате бмп( Броневая Машина Пехоты :)) , а можна по-подробнее

в смысле как из него получить данные в виде (x,y) - (rgb)
тока winAPI не надо, плз.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33669442
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
latexto Absurd

ты говорил о формате бмп( Броневая Машина Пехоты :)) , а можна по-подробнее

в смысле как из него получить данные в виде (x,y) - (rgb)
тока winAPI не надо, плз.
Создаешь двухмерный массив типа BYTE[width][height] и прямо туда читаешь, прочитав предварительно заголовки (BITMAPFILEHEADER, BITMAPINFOHEADER и RGBQUAD[] для палитровых режимов). Надо помить
1) Размер одной горизонтальной строки в байтах всегда должен быть кратен 4 и добивается пустыми байтами в случае необходимости. Пример - битмап 11x10, 24 bits per pixel (8 bit red, 8 bit green, 8 bit blue). Размер строки - 3 байта на пиксел * 11 = 33. 33 на 4 не делится, и ближайшее число которое делится это 36. Следовательно, массив должен быть BYTE[36][10].
2) В TrueColor цвета зачем-то идут в обратном формате - первый байт - blue, второй - green, третий - red.
3) Сканлинии зачем-то идут снизу вверх - если массив объявлен как BYTE arr[36][10], то синяя составляющая левого верхнего пиксела будет arr[0][9], зеленая - arr[1][9] и красная - arr[2][9]. Наверно, ось Y в Декартовой системе координат MS захотел направить по-академичному вверх.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33669467
latex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Сергей Ильич : пасиба

Действительно догадатся самому до этого было нереально.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33670276
Борманнн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
latexto Absurd
ты говорил о формате бмп( Броневая Машина Пехоты :))
Для тех кто на (под) броней: Не "Броневая" а "Боевая"- учи матчасть, а то может представиться счастье опробовать данную технику на деле на ближайшие 2 года
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33674985
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void CImageDlg::OnButton1()
{

char InString[9],as[9]={0}; int a;
CFile f;
if(f.Open("d:\\1.bmp",CFile::modeRead)==FALSE)
return;
f .Read(InString,9);

int x_bmp,y_bmp;

CBitmap bmp;
bmp.LoadBitmap(InString);

CPaintDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&bmp);
BITMAP bm;
x_bmp=bm.bmWidth;
y_bmp=bm.bmHeight;
dc.BitBlt(0,0,x_bmp,y_bmp,&memdc,0,0,SRCCOPY);
}
Что-то не срастается там, где выделил. Ошибок не дает, но ничего и не показывает. Картинка копируется в InString. Не важно, что читаю байты сначала (там идет формат), все равно бы показывал какой-нибудь шум.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33684544
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
void CImage2Dlg::OnButton1()
{
int x_bmp,y_bmp;
CBitmap bmp;
bmp.LoadBitmap("IDB_BMP1");

CPaintDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&bmp);
BITMAP bm;
x_bmp=bm.bmWidth;
y_bmp=bm.bmHeight;
dc.BitBlt(0,0,x_bmp,y_bmp,&memdc,0,0,SRCCOPY);
}
Так все отлично получается, но картинка при этом должна быть импортирована в ресурсы. А без этого никак нельзя ?
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33684746
Борманнн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
neskifvoid CImage2Dlg::OnButton1()
{
int x_bmp,y_bmp;
CBitmap bmp;
bmp.LoadBitmap("IDB_BMP1");

CPaintDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&bmp);
BITMAP bm;
x_bmp=bm.bmWidth;
y_bmp=bm.bmHeight;
dc.BitBlt(0,0,x_bmp,y_bmp,&memdc,0,0,SRCCOPY);
}
Так все отлично получается, но картинка при этом должна быть импортирована в ресурсы. А без этого никак нельзя ?
Канешна мона: ::LoadImage(<см. MSDN>)
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33687061
neskif
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борманнн Канешна мона: ::LoadImage(<см. MSDN>)
Ну весьма доходчиво - краткость сестра таланта. Смотрел уже, но из файла, не импортированного в ресурсы пока не получается.
...
Рейтинг: 0 / 0
Чтение изображения из файла
    #33687942
Alex_VC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, видимо, не внимательно читал:

HANDLE LoadImage( HINSTANCE hinst,
LPCTSTR lpszName,
UINT uType,
int cxDesired,
int cyDesired,
UINT fuLoad
);
Parameters

....
fuLoad
[in] This parameter can be one or more of the following values.
...
LR_LOADFROMFILE Loads the image from the file specified by the lpszName parameter. If this flag is not specified, lpszName is the name of the resource.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение изображения из файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]