2017-01-25 25 views
1

Я пытаюсь увеличить масштаб своей программы. У меня возникла проблема с распределением нового пространства для моего масштабированного изображения, но я думаю, что он исправлен. Проблема, с которой я сталкиваюсь, заключается в том, что программа вылетает, когда я пытаюсь отправить свое изображение из своего временного владельца.Масштабирование изображения с помощью ближайшего соседа

Загруженное изображение находится в моем structImage. Пиксели размещены в img->pixels, высота в img->height и ширина img->width. Но я понятия не имею, почему программа вылетает, когда я передаю пиксели из своего в свой imgstruct, пока он не падает, когда я делаю противоположное. Вот код:

void makeBigger(Image *img, int scale) { 

    Image *tmp2; 
    tmp2 = (Image*)malloc(sizeof(Image)); 
    tmp2->height = img->height*scale; 
    tmp2->width = img->width*scale; 

    tmp2->pixels = (Pixel**)malloc(sizeof(Pixel*)*tmp2->height); 
    for (unsigned int i = 0; i < img->height; i++) 
    { 
     tmp2->pixels[i] = (Pixel*)malloc(sizeof(Pixel)*tmp2->width); 
     for (unsigned int j = 0; j < img->width; j++) 
     { 
      tmp2->pixels[i][j] = img->pixels[i][j]; 
     } 
    } 
    free(img->pixels); 

    //scaling up the struct's height and width 
    img->height *= scale; 
    img->width *= scale; 

    img->pixels = (Pixel**)malloc(sizeof(Pixel*)*img->height); 
    for (unsigned int i = 0; i < tmp2->height; i++) 
    { 
     img->pixels[i] = (Pixel*)malloc(sizeof(Pixel)*img->width); 
     for (unsigned int j = 0; j < tmp2->width; j++) 
     { 
      img->pixels[i][j] = tmp2->pixels[i+i/2][j+j/2]; 
     } 
    } 
} 

Я был бы рад, если у вас есть представление о том, как заставить метод ближайшего соседа работать. Спасибо!

EDIT: Я пытаюсь обрезать внутренний прямоугольник, чтобы масштабировать его (увеличение).

Image *tmp = (Image*)malloc(sizeof(Image)); 
tmp->height = img->height/2; 
tmp->width = img->width/2; 

tmp->pixels = (Pixel**)malloc(sizeof(Pixel*) * tmp->height); 
for (unsigned i = img->height/4 - 1; i < img->height - img->height/4; i++) { 
    tmp->pixels[i] = (Pixel*)malloc(sizeof(Pixel) * tmp->width); 
    for (unsigned j = img->width/4; j < img->width - img->width/4; j++) { 
     tmp->pixels[i][j] = img->pixels[i][j]; 
    } 
} 

for (unsigned i = 0; i < img->height; i++) { 
    free(img->pixels[i]); 
} 
free(img->pixels); 

img->height = tmp->height; 
img->width = tmp->width; 
img->pixels = tmp->pixels; 
free(tmp); 
+1

"программа падает". Способ отладки таких проблем - отладчик. – kaylum

+0

Да, я не уверен, в чем дело. Кажется, что tmp2-> pixels не получает никаких значений RGB, что кажется странным.Однако программа запускается, и у меня нет предупреждений. – Henke

+0

Для этого нужен отладчик! Это позволяет вам пройти через код по строкам и изучить переменные, чтобы увидеть, где все начинает идти не так. – kaylum

ответ

2

Я вижу, что вы чрезмерны (например, перебираете изображение).
Вот код (я отправляю всю программу - я сделал предположение о Pixel и Image, которые могут не соответствовать тому, что у вас есть), но если скопировать/вставить makeBigger он должен работать в вашем коде OOTB:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

typedef uint32_t Pixel; 

typedef struct { 
    uint32_t width, height; 
    Pixel **pixels; 
} Image; 


void makeBigger(Image *img, int scale) { 
    uint32_t i = 0, j = 0; 
    Image *tmp = (Image*)malloc(sizeof(Image)); 
    tmp->height = img->height * scale; 
    tmp->width = img->width * scale; 

    tmp->pixels = (Pixel**)malloc(sizeof(Pixel*) * tmp->height); 
    for (i = 0; i < tmp->height; i++) { 
     tmp->pixels[i] = (Pixel*)malloc(sizeof(Pixel) * tmp->width); 
     for (j = 0; j < tmp->width; j++) { 
      tmp->pixels[i][j] = img->pixels[i/scale][j/scale]; 
     } 
    } 

    for (i = 0; i < img->height; i++) 
     free(img->pixels[i]); 
    free(img->pixels); 

    img->width = tmp->width; 
    img->height = tmp->height; 
    img->pixels = tmp->pixels; 
    free(tmp); 
} 


void printImage(Image *img) { 
    printf("Width: %d, Height: %d\n", img->width, img->height); 
    for (uint32_t i = 0; i < img->height; i++) { 
     for (uint32_t j = 0; j < img->width; j++) 
      printf("%3d", img->pixels[i][j]); 
     printf("\n"); 
    } 
    printf("\n"); 
} 


int main() { 
    uint32_t i = 0, j = 0, k = 1; 
    Image img; 
    // Allocate and initialize the image data 
    img.height = 2; 
    img.width = 3; 
    img.pixels = (Pixel**)malloc(sizeof(Pixel*) * img.height); 
    for (i = 0; i < img.height; i++) { 
     img.pixels[i] = (Pixel*)malloc(sizeof(Pixel) * img.width); 
     for (j = 0; j < img.width; j++) 
      img.pixels[i][j] = k++; 
    } 

    printImage(&img); 
    makeBigger(&img, 2); 
    printImage(&img); 

    // Deallocate the image data 
    for (i = 0; i < img.height; i++) 
     free(img.pixels[i]); 
    free(img.pixels); 

    return 0; 
} 

Примечание (makeBigger связанных - предназначено для замены содержимого изображения заданных в качестве аргумента):

  • Construct временного изображения, которое будет Расширенными один
  • Перемещение только image раз (заполните свои пиксели по мере их распределения); поддерживать масштабирование к исходному изображению и убедитесь, что соответствующий пиксель «копируется» в новом, просто разделите индексы от коэффициента масштабирования: tmp->pixels[i][j] = img->pixels[i/scale][j/scale]
  • DEALLOCATE оригинального содержания изображения : поскольку каждый пиксель строка malloc ред, он также должен быть free д (одна free(img->pixels); даст утечки памяти)
  • сохранить содержимое временного изображения в оригинал и затем освободить его

Запуска выше программ (скомпилированные с помощью НКУ), будет выводить следующее:

Width: 3, Height: 2 1 2 3 4 5 6

Width: 6, Height: 4 1 1 2 2 3 3 1 1 2 2 3 3 4 4 5 5 6 6 4 4 5 5 6 6

+0

Это работает безупречно и отлично. Спасибо за этот подробный ответ! Я надеюсь, что другие получат помощь от вашего ответа и сейчас. – Henke

+0

Добро пожаловать :) – CristiFati

+0

О, бет, я пытаюсь увеличить изображение. И я думал, что сначала беру кусочек середины, а затем сделаю его таким же размером, как и оригинал. Но я не могу получить средний кусок ... Знаете ли вы, что не так? Я отредактирую свой вопрос. – Henke