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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maxon887
12 / 12 / 3
Регистрация: 05.06.2012
Сообщений: 280
#1

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

29.07.2013, 14:15. Просмотров 341. Ответов 0
Метки нет (Все метки)

Задача вырезать часть матрицы изображения по двум точкам(верхниму-левом и правому нижнему).
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)
Изображения
  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 14:15     Вырезка части изображения по двум точкам
Посмотрите здесь:

Уравнение прямой по двум точкам - C++
#include &lt;iostream&gt; using namespace std; void main() { setlocale (LC_ALL, &quot;rus&quot;); int x1, y1, x2, y2, x, y, line; cout &lt;&lt;...

Найти интеграл по точкам - C++
Программа должна считать интеграл по точкам #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; double f(double x); ...

перемещать квадрат по точкам - C++
ребят,помогите пожалуйста,есть код программы где квадрат перемещается по сетке,а нужно чтоб по точкам,где и на что исправить? class SETKA...

построение графика по заданным точкам - C++
Доброго времени суток! Очень нужна помощь: вывести на экран график по заданным координатам точек из файла..строить нужно в консоли. ...

Рисование отрезка по точкам (ошибки в работе) - C++
Есть программа, которая требует ввести точки начала и конца отрезка и рисует этот отрезок. Но она не работает. При попытке ввода значений...

Определить тип треугольника по его точкам - C++
Что-то никак не получается :( На вход программы даются три наруральных числа a, b, c. Если не существует невырожденного треугольника...

Полином Лагранжа - Сделать интерполяцию по точкам - C++
Необходимо сделать интерполяцию по точкам. Не могу найти ошибку(выдает неправильные значения в промежуточных точках), помогите пожалуйста ...

Построить по 3 точкам выпуклый шестиугольник минимального размера - C++
Доброго времени суток. Большая просьба помочь с кодом. Задача: Даны координаты 3 точек в двумерной плоскости. Необходимо найти...

Нахождения перимтров нескольких трапеций заданных по точкам - C++
Вот сама задача.&quot;На вход подается некоторое количество трапеций (координаты вершин). Отсортировать и вывести их по возрастанию периметров. ...

Создание в BitMap окружности заданного радиуса по точкам - C++
Добрый день! Подскажите, пожалуйста, как нарисовать окружность в BitMap заданного радиуса по точкам, если можно с примером. Заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru