Форум программистов, компьютерный форум CyberForum.ru

Картинка в виде двумерного массива пикселей - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ как исправить повреждением кучи http://www.cyberforum.ru/cpp-beginners/thread635204.html
Всем привет. Имеется такой кусок кода, который читает в условном формате дату из реестра и сохраняет её в структуру, где есть SYSTEMTIME: TCHAR * timeT=new TCHAR;//главные виновники, из-за низ вылетает в конце кода программа TCHAR * TempTimeT=new TCHAR; len=MAX_PATH; ZeroMemory(NUMBER, 15);//очищаем и создаем имя, по которому обратимся в реестр ZeroMemory(Name, 20);...
C++ Сканирование экрана Здравствуйте, нужна помощь новичку по winapi. Нужно сделать сканирование выбранной области экрана и запись результата в двумерный массив, где каждая ячейка это цвет в RGB. Делал через GetPixel, но это ужасно медленно. Читал про BitBlt но, к сожалению, не понял, как потом его в RGB переводить. Помогите пожалуйста, желательно с примером кодом. Спасибо. Добавлено через 1 час 3 минуты Уточню.... http://www.cyberforum.ru/cpp-beginners/thread635196.html
Площадь многоугольника C++
Необходимо вычислить площади двух многоугольников(ну а в дальнейшем проверить, лежит ли один из них в другом, пока мне это не надо) по известным вершинам. У меня получилось вот это."Это" не работает.Где ошибки? Заранее спасибо:) #include<iostream> #include<cstdlib> #include<cmath> using namespace std; float Ploshad(float x,float y, const int n); int main(){ int i,n1,n2; ...
приоритет. странно C++
привет всем прогерам С++ =) есть такой вопрос. Вроде ни чего сложного, но компилятор компилит это дело не так как ожидается. Есть такое предложение. IN = *block++ << 8; если указатель block ссылается на начало массива M M = {1,2,3,4,5,6,7,8,9,10}; То по таблице приоритетов сначала выполнится ++ затем * после << и только в конце будет =. В IN должно оказаться число 512:ireful:, НОоо...
C++ Перегрузка бинарной операции < http://www.cyberforum.ru/cpp-beginners/thread635163.html
Всем привет написал перегрузку для структуры: typedef struct t_FileInfo { t_String file_name; /*имя файла*/ t_String file_way; /*адрес к файлу*/ /*конструктор с параметрами*/ t_FileInfo(t_String fn = (""), t_String fw = ("")) :
C++ Не инициализируется переменная Проблема в том, что строка номер 18 полностью игнорируется, почему - вообще не понимаю. Значение i остается абракадаброй или нулем, если заранее проинициализировать переменную. #include "std_lib_facilities.h" int main() { setlocale(LC_CTYPE,"RUS"); setlocale( LC_ALL,"" ); vector<double>numbers; //вектор, куда будут добавляться числа, по мере набора их пользователем подробнее

Показать сообщение отдельно
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
10.08.2012, 12:04     Картинка в виде двумерного массива пикселей
Какую именно картинку вы хотите загрузить? если простой битмап (формат .bmp), то нужно считать заголовок сначала, затем пиксели.
Формат битмапа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct tagBITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
}BITMAPINFOHEADER, *PBITMAPINFOHEADER;
Читать можно так (для винды):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <windows.h>
bool ReadBMP24bit(char* Name,BITMAPINFOHEADER* BM,BYTE** data){
HANDLE H=CreateFile(Name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    if(f1!=INVALID_HANDLE_VALUE){
        RBlockRead(f1,BM,sizeof BMPformat);
        if(IOresult()||BM->bfType!='MB')return false;
        if(BM->biBitCount!=24)return false;
        *data=new BYTE(byte,BM->biWidth*BM->biHeight*3);
        int wid=BM->biWidth*3;
        int rwid=wid;
        if(wid&3)rwid=(wid|3)+1;
        for(int i=0;i<BM->biHeight;i++){
            RSeek(f1,(sizeof BMPformat)+(BM->biHeight-i-1)*rwid);
            RBlockRead(f1,&((*data)[i*wid]),wid);
        };
        CloseHandle(H);
        return true;
    }else return false;
};
Загружаем так:
C++
1
2
3
BYTE* data;
BITMAPINFOHEADER BM;
ReadBMP24Bit("C:\\Games\\picture.bmp",&BM,&data);
Дальше можно работать с массивом data (изменять пиксели и т.д.). Функция на примере загружает 24 битные изображения только, но можно переписать код и для 32 или 16

Добавлено через 12 часов 26 минут
У меня там опечка: вместо BMPformat должно быть BITMAPINFOHEADER.
 
Текущее время: 16:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru