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

Вырезка части изображения по двум точкам - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Форма записи с использованием "?" знака http://www.cyberforum.ru/cpp-beginners/thread930326.html
#include <iostream> int main() { int a = 0; int b = 0; int res = 0; std::cin >> a >> b; res = (a > 0 && b < 10) ? a: 100;
C++ Что лучше использовать, #define или typedef? Вот привожу пример программы. Здесь можно и с #define сделать и с typedef. Программа в любом случае будет прекрасно работать. Там что же использовать? //#define ui unsigned int typedef unsigned int ui; int main() { ui n = 5; http://www.cyberforum.ru/cpp-beginners/thread930323.html
Доступ к памяти по адресу C++
Есть структура, элементы которой адрес на начало массива в памяти и его размер. Адреса хранятся в 16-ричном формате. Мне нужно распечатать то, что лежит в этом массиве. for (int i = 0; i <= ((int)(current->_size)); i++) { TraceFile << (current->_address)<<endl; } (current->_address) - некорректно, не могу придумать, как сделать иначе
Найти ошибку в решении задачи "Шифровка" (acmp) C++
Шифровка (Время: 1 сек. Память: 16 Мб Сложность: 29%) Разведкой был перехвачен ряд шифровок, которые передавал Джеймс Бонд. Известно, что каждое послание зашифровано методом циклического сдвига. Суть которого в том, что каждая буква заменяется на букву, отстоящую в алфавите от первой на определенном расстоянии. Это расстояние называется знаменателем шифра. Так, при знаменателе шифра 2 буква...
C++ С чего начать учиться программированию http://www.cyberforum.ru/cpp-beginners/thread930305.html
Подскажит пожалуйста с чего начать учиться программированию, какие советы вы можете дать?
C++ Что делает строка? Что делает 14 строка? P.S. Программа читает пары с файла и выводит их на экран. # include <iostream> # include <string> # include <vector> # include <algorithm> # include <cmath> # include <windows.h> #include <fstream> using namespace std; подробнее

Показать сообщение отдельно
maxon887
 Аватар для maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
29.07.2013, 14:15     Вырезка части изображения по двум точкам
Задача вырезать часть матрицы изображения по двум точкам(верхниму-левом и правому нижнему).
P.S. работаю c libtiff. тестирую в qt. Изображение 8bit'е
Функция вырезки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
bool TiffFile::Read(const char *fileName, int x1, int y1, int x2, int y2)
{
    tif=TIFFOpen(fileName,"r");
    if(tif)
     {
        int compression=0;
        int planar=0;
        TIFFGetField(tif,TIFFTAG_COMPRESSION,&compression);
        TIFFGetField(tif,TIFFTAG_PLANARCONFIG,&planar);
        if((compression==1)&&(planar==PLANARCONFIG_CONTIG))
        {
            if(mat!=0)
            {
                delete[] mat;
                height=0;
                width=0;
                depth=0;
                channels=0;
            }
            TIFFGetField(tif,TIFFTAG_IMAGELENGTH,&height);
            TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&width);
            TIFFGetField(tif,TIFFTAG_BITSPERSAMPLE,&depth);
            TIFFGetField(tif,TIFFTAG_SAMPLESPERPIXEL,&channels);
            if((x1<width&&x1>=0)&&(x2<width&&x2>=0)&&(y1<height&&y1>=0)&&(y2<height&&y2>=0)&&(x2>x1)&&(y2>y1))
            {
                mat=new char[(x2-x1)*(y2-y1)*(depth/8)*channels];
                //cout<<"size of "<<(x2-x1)*(y2-y1)*(depth/8)*channels<<endl;
                char *line=new char[width*(depth/8)*channels];
                for(int i=y1;i<y2;i++)
                {
                    TIFFReadScanline(tif,line,i);
                    for(int j=x1;j<x2;j++)
                    {
                        mat[(i-y1)*(x2-x1)+j-x1]=line[j];
                    }
                }
                width=x2-x1;
                height=y2-y1;
                TIFFClose(tif);
                return true;
            }
            else
            {
                cout<<"Point not in the image area."<<endl;
                return false;
            }
        }
        else
        {
            cout<<"Sorry.Given type of image is not supported.Refer to Lukyanau Maxim"<<endl;
            return false;
        }
     }
     else
    {
         cout<<"Can not open image"<<endl;
         return false;
    }
}
Тестирование
C++ (Qt)
1
2
3
4
5
6
7
8
9
    QString fileName(QFileDialog::getOpenFileName(this,tr("Open files"),QDir::currentPath(),tr("MVR files (*.tiff;*.tif)")));
    TiffFile tiff;
    tiff.Read(fileName.toAscii(),0,0,99,99);
    QImage *img=new QImage((uchar*)(tiff.Matrix()),tiff.Widht(),tiff.Height(),QImage::Format_Indexed8);
    QVector<QRgb> colorTable;
    for (int i = 0; i < 256; i++)
        colorTable.push_back(QColor(i, i, i).rgb());
    img->setColorTable(colorTable);
    img->save("my2.png","PNG");
результаты при (0,0) (100,100)
результаты при (0,0) (99,99)
Изображения
  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru