Доброго времени суток. Моя цель : необходимо написать функцию, в которую передаются 5 параметров, первые 4 - координаты изображения, выведенного на экране, последний параметр H - это целое число. Требуется поделить изображение на Н одинаковых квадратов, после чего вывести их в определённом порядке в том же месте, где была изначальная картинка (это часть одной большой задумки). Вероятней всего наиболее удобно будет использовать одномерный массив из Н элементом, состоящих из структуры, которая хранит координаты каждого из маленьких квадратиков, а так же саму маленькую картинку. Вот, с релизацией возникли проблемки. Теперь начну сначала, и первый вопрос : как продефинировать вышеописанную структуру? (с коордианатами ясно, а вот как запихнуть туда ячейку в которой будет хранится небольшое изображение, которое занесётся в память, например, тем же getimage) Спасибо.
typedef
struct __IMAGEPART {
int x_left, y_top;
int x_right, y_bottom;
void *buffer; // здесь - указатель на буфер, хранящий собственно изображение
} IMAGEPART;
Cпасибо, начну реализовывать, если появятся вопросы, отпишусь.
Появился следующий вопрос. Допустим на экран выведена картинка плотностью 256 цветов. Занесёт ли getimage в память участок картинки такой плотностью без потерь красок?
А функции getimage все равно, сколько у тебя цветов... Она просто
Понятно, просто возникла проблема, что putimage выводит ухудшенное изображение, наверно где - то неуловил переход видеорежимов. Здесь прикрплён проект. При запуске, когда появится меню, на кнопке старт при нажатии ентер программа считывает бмп файл, потом вырезает его маленький левый верхний кусочек и выводит его. Но выводит его как я уже отписал ухудшенно. Посмотрите пожалуйста, просто насколько я заметил считывание в память и вывод происходят в одном видеорежиме.
Я вообще не понимаю, как твоя программа могла работать... Память-то под буфер ты не выделил... Вот так (здесь нет всех необходимых проверок, это просто пример) попробуй:
void imrand (x1, x2, y1, y2, n) {
void *buf;
int storona, i, d, size;
storona = (x2 - x1) * (y2 - y1) / (n * n); // Зачем это?
size = imagesize(x1, x2, y1, y2);
if((buf = malloc(size)) != NULL) {
getimage (x1, x2, y1, y2, buf);
cleardevice();
putimage (50, 50, buf, COPY_PUT);
free(buf);
};
}
Про сторону - это я в будущем буду использовать, чтобы разделить картинку на равные элементы - квадраты. Спасибо за подсказку, сейчас буду разбираться. Да, всё работает, огромное спасибо, я как - то и упустил, что надо память выделять, думал, что этот процесс автоматизирован.
У меня снова новый вопрос по данной теме Имеется структура, которую помог описать volvo :
typedef
struct __IMAGEPART {
int x_left, y_top;
int x_right, y_bottom;
void *buffer;
} IMAGEPART;
IMAGEPART arr[n][n];, но компилятор ругается и, насколько я понял, хочет видеть там константые величины, как быть ? При чём заведомо известно, что 1 < n < 5. По идее можно создать 5 массивов и кейсом, в зависимости от n выбрать тот, с которым будет работа, или как в паскале, описать максимально - возможный массив, но работать только с частью (не нравится этот вариант), но возможно есть что - то по логичнее или проще. Спасибо.
IMAGEPART **arr;
int i;
arr = (IMAGEPART **)malloc(n * sizeof(IMAGEPART*));
for(i = 0; i < n; ++i)
arr[i] = (IMAGEPART *)malloc(n * sizeof(IMAGEPART));
Понятно. Допустим, уже известно число n (тут оно уже K ). Я пытался дописать процедуру так, чтобы всё считалось в структуру и потом так же вывелось обратно, вот что я нахимичил, но это всё выводит только первый кусочек, что же не так ? :
IMAGEPART picturemas[K][K];
void *buf[K];
int a, i, d, size, j, xx1, xx2, yy1, yy2, sum = 0;
a = (x2 - x1) * (y2 - y1) / (n * n); //сторона квадрата
// size = imagesize(x1, x2, y1, y2);
//
// if((buf = malloc(size)) != NULL)
// {
// getimage (x1, x2, y1, y2, buf);
// cleardevice();
// putimage (50, 50, buf, COPY_PUT);
// free(buf);
// };
xx1 = x1;
yy1 = y1;
xx2 = xx1 + a;
yy2 = yy1 - a;
for (i = 0; i < (K - 1); i++)
{
for (j = 0; j < (K - 1); j++)
{
picturemas[i][j].x_left = xx1;
picturemas[i][j].x_right = xx2;
picturemas[i][j].y_top = yy1;
picturemas[i][j].y_bottom = yy2;
size = imagesize (xx1,xx2,yy1,yy2);
if ((picturemas[i][j].buffer = malloc(size)) != NULL)
getimage(xx1,xx2,yy1,yy2,picturemas[i][j].buffer);
xx1 = xx1 + a;
xx2 = xx2 + a;
}
yy1 = yy1 - a;
yy2 = yy2 - a;
xx1 = x1;
xx2 = x2;
}
// Очищаем экран и пытаемся всё вывести как и было до очистки
cleardevice();
for (i = 0; i < (K - 1); i++)
for (j = 0; j < (K - 1); j++)
putimage (picturemas[i][j].x_left, picturemas[i][j].y_top, picturemas[i][j].buffer , COPY_PUT);
};
Я так и не понял логику твоей программы, но смотри:
...
const int K = 5; // <--- попробуем запомнить 5*5 квадратов ...
IMAGEPART picturemas[K][K];
int a, i, size, j, xx1, xx2, yy1, yy2, sum = 0;
a = 20; // <--- размером 20 * 20 каждый
// начиная с позиции (x1, y1)
xx1 = x1; xx2 = xx1 + a;
yy1 = y1; yy2 = yy1 + a;
for (i = 0; i < (K - 1); i++) {
for (j = 0; j < (K - 1); j++) {
picturemas[i][j].x_left = xx1;
picturemas[i][j].x_right = xx2;
picturemas[i][j].y_top = yy1;
picturemas[i][j].y_bottom = yy2;
size = imagesize (xx1,yy1,xx2,yy2); // <--- Во-первых у тебя были перемешаны координаты
// ну, а во вторых - надо проверять выделена ли память ...
if ((picturemas[i][j].buffer = malloc(size)) != NULL) {
// Если она выделена - то "граббить" изображение
getimage(xx1,yy1,xx2,yy2,picturemas[i][j].buffer);
xx1 = xx1 + a; xx2 = xx2 + a; // и переходить по оси OX
}
else {
closegraph(); // иначе - выходить (ну, или возвращать код ошибки: не хватает памяти)
exit(1);
}
}
yy1 = yy1 + a; yy2 = yy2 + a; // тут переходим по OY НИЖЕ (ось OY идет сверху вниз)
xx1 = x1; xx2 = x1 + a; // и перебрасываемся по OX на начальную позицию (здесь тоже ты ошибался...)
}
cleardevice();
for (i = 0; i < (K - 1); i++)
for (j = 0; j < (K - 1); j++)
if(picturemas[i][j].buffer) // эту проверку в принципе теперь можно убрать, но я проверял с ней
putimage (picturemas[i][j].x_left, picturemas[i][j].y_top, picturemas[i][j].buffer , COPY_PUT);
...
Спасибо! Я продолжаю разбираться!
Странно получается, данная процедура в конце концов выводит не всё изображение, а только его часть. Кстати, а почему вы взяли сторону именно за 20 ? Для проверки ? Просто, чтобы картинка осталось прежней по размеру вероятно надо взять сторону за (x2 - x1) * (y2 - y1) / (k * k). При чём в таком случае всё равно результирующая картинка маленькая (что - то я опять перемудрил наверно).
Я почему - то возомнил, что моё изображение это большой квадрат (сам не знаю почему). Ваши комментарии абсолютно точны, сейчас изменяю процедуру.
Вот, используя все ваши замечания я немного изменил функцию, но в таком случае ничего не выводится кроме чёрного экрана, хотя вроде программа не виснет ( K = 5; n = 5; );
IMAGEPART picturemas[K][K];
int a, i, size, j, xx1, xx2, yy1, yy2, b;
a = (x2 - x1) / n; //side by x
b = (y2 - y1) / n; //side by y
xx1 = x1; xx2 = xx1 + a; // 1st cells position
yy1 = y1; yy2 = yy1 + b;
for (i = 0; i < (K - 1); i++)
{
for (j = 0; j < (K - 1); j++)
{
picturemas[i][j].x_left = xx1;
picturemas[i][j].x_right = xx2;
picturemas[i][j].y_top = yy1;
picturemas[i][j].y_bottom = yy2;
size = imagesize (xx1,yy1,xx2,yy2); // <--- Во-первых у тебя были перемешаны координаты
// ну, а во вторых - надо проверять выделена ли память ...
if ((picturemas[i][j].buffer = malloc(size)) != NULL) {
// Если она выделена - то "граббить" изображение
getimage(xx1 ,yy1, xx2, yy2, picturemas[i][j].buffer);
xx1 = xx1 + a; xx2 = xx2 + a; // и переходить по оси OX
}
else {
closegraph(); // иначе - выходить (ну, или возвращать код ошибки: не хватает памяти)
exit(1);
}
}
yy1 = yy1 + b; yy2 = yy2 + b; // тут переходим по OY НИЖЕ (ось OY идет сверху вниз)
xx1 = x1; xx2 = x1 + a; // и перебрасываемся по OX на начальную позицию (здесь тоже ты ошибался...)
}
cleardevice();
for (i = 0; i < (K - 1); i++)
for (j = 0; j < (K - 1); j++)
if(picturemas[i][j].buffer) // эту проверку в принципе теперь можно убрать, но я проверял с ней
putimage (picturemas[i][j].x_left, picturemas[i][j].y_top, picturemas[i][j].buffer , COPY_PUT);
Чему равно K?
(Программа и не будет виснуть, она просто завершится при невозможности выделения памяти и все... Кстати, зачем ты удалил проект? Как теперь я могу проверить работу твоей функции?)