Чтение байтового массива в координаты X и Y из растрового изображения? - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь повернуть растровое изображение по часовой стрелке на 90 градусов.Я попытался изменить ширину на высоту и высоту на ширину для информационного заголовка, поэтому, когда он зацикливается, он зацикливает высоту, а затем ширину, но не вращается, поэтому я предполагаю, что мне нужно поместить их в координаты X и Y изСекция байтового массива.Я застрял уже 3 дня, поэтому, если возможно, пожалуйста, помогите мне!Огромное спасибо.Пожалуйста, направьте меня через коды здесь, еще раз спасибо!

hfile = CreateFile(ofn.lpstrFile, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL );
            ReadFile(hfile, &bfh, sizeof(bfh), &written, NULL); 
            ReadFile(hfile, &bih, sizeof(bih), &written, NULL); 
            bmi.bmiHeader = bih;
            int imagesize = bih.biHeight * bih.biWidth * 3; // Allocate necessary data for image
            image = new BYTE[imagesize];
            image1 = new BYTE[imagesize];
            ReadFile(hfile, image, imagesize, &written, NULL);
            SetDIBitsToDevice(hdc, 0, 0, bih.biWidth, bih.biHeight, 0, 0, 0, 
                bih.biHeight, image,&bmi,DIB_RGB_COLORS); 

            width = bih.biHeight;
            height = bih.biWidth;
            for(int x=0; x<height; x++)
            {
                for(int y=0; y<width; y++)
                {

                    image1[(y*height+x)*3+0] = image[(y*height-1-x)*3+0]; 
                    image1[(y*height+x)*3+1] = image[(y*height-1-x)*3+1];
                    image1[(y*height+x)*3+2] = image[(y*height-1-x)*3+2]; 

                }
            }   
            SetDIBitsToDevice(hdc,height,0,width,height,0,0,0,bih.biHeight,image1,&bmi,DIB_RGB_COLORS);
            width = bih.biHeight;
            height = bih.biWidth;
            ReleaseDC(hwnd, hdc);
            return 0;
            EndPaint(hWnd, &ps);
            return 0;

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Я понял это.

Добавлены координаты точки1 и точки2, которые принимают байтовый массив изображения и возвращают x и y.

Оттуда я понял,

С петлей for, переключением высоты и ширины свыше

image1[point2(height-1-y,x)+0] = image[point1(x,y)+0];

Все равно спасибо!

0 голосов
/ 17 января 2012

Если мы можем разбить это на класс, который имеет буфер данных и способен «получить» и «установить» цвет по индексу матрицы (x, y) из такой матрицы, тогда ваша работа будет легче .

Таким образом, мы могли бы иметь самое простое

setPixel( int x, int y, BYTE red, BYTE green, BYTE blue );

и

getPixel( int x, int y, BYTE& red, BYTE& green, BYTE& blue ) const;

Конечно, мы могли бы поместить RGB в одну "структуру".

Тогда вы могли бы иметь

image2.setPixel( height-y-1, x, image1.getPixel( x, y, red, green blue ) );

в вашем цикле, и он должен вращаться, пока ваш класс настроен правильно.

...