2013-12-07 7 views
0

Я пытаюсь перевернуть изображение в C вертикально таким образом, если изображение < это закончится> и моя функция включает в себяПодавать Вершины с C

//Setting the struct up for the pixel's 
struct pixel 
{ 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
}; 

//Setting the struct up for the Image Type and scanning in the pxiels into an array 
struct ImageType 
{ 
    char ppImage[3]; 
    char comment[256]; 
    char newlinechar; 
    int width, height; 
    int maxColor = 255; 
    struct pixel image[100][100]; 
}; 


//Function in order to flip the image, going from the left most pixel flipping with the  right most 
void MirrorVertical(struct ImageType imgur) 
{ 
    int x,y; 
    const int middle = imgur.width/2; 
    struct pixel tmp; 
    struct *pixel p; 

    for(y=0; y < imgur.height; ++y) 
     { 
     p = tmp + y * imgur.width; 

     for(x=0; x < middle; ++x) 
      { 
       tmp = p[x]; 
       p[x] = p[imgur.width - 1 - x]; 
       p[imgur.width - 1 - x] = tmp; 
      } 
     } 
} 

Я получил мои Структуры работать, но по какой-то причине мой функция не выведет его, я сканирую изображение в структуру, поэтому ....

//Scanning in the pixels for the first image 
    for(i=imageA.height-1; i <= 0; i--) 
     { 
     for(j=0; j < imageA.width; j++) 
      { 
       scanf("%hhu", &imageA.image[i][j].red); 
       scanf("%hhu", &imageA.image[i][j].green); 
       scanf("%hhu", &imageA.image[i][j].blue); 
      } 
     } 

Что я делаю неправильно в своей функции?

Это должно быть

for(x=0; x < width; x++) 
     { 
     for(y = 0; y < height/2; y++) 
      { 
       temp = imgur.image[x][y]; 
       imgur.image[x][y] = imgur.image[x][height-y-1] 
       imgur.image[x][height-y-1] = temp; 
      } 
     } 
} 
+0

«Моя функция не выводит его». Можете ли вы уточнить свою проблему? Можете ли вы удалить все, что не имеет прямого отношения? – Floris

+0

@Floris Извините, моя проблема в моей функции, я пытаюсь переключить свои свопы, мои пиксели, при сканировании с изображения PPM, на обратное или (зеркальное отображение).Я не могу понять, как взять то, что я сканировал для структурного пикселя, который является изображением.A.image [i] [j] .red и т. Д. ... и вызывает его внутри функции для обмена ниже –

ответ

1

Я полагаю, ваш компилятор должен жаловаться на

struct pixel tmp; 
struct *pixel p; 

for(y=0; y < imgur.height; ++y) 
    { 
    p = tmp + y * imgur.width; 

Вы добавляете-структуру к междунар и распределения результата на указатель. Как это должно работать?

EDIT Теперь, когда вы обновили свой вопрос с помощью «лучшего» кода, и он все еще не работает, вот несколько вещей, которые вы могли/должны были изменить.

  1. Вы объявляете переменную tmp затем попытаться получить доступ temp. Рецепт отказа
  2. Вы передаете всю функцию struct imgur функции. Это означает «сделать копию всего». Вы действительно должны передать указатель на объект - изменить прототип, чтобы отразить это, и доступ к элементам, как imgur->height и т.д.
  3. Вы никогда не объявлять переменные height и width в вашей MirrorVertical функции
  4. (второстепенный) Вы можете вычислить значение height - 1 - y дважды на внутренний цикл - всего 20000 раз. Если вы меняете внутреннюю и внешнюю петли и вычисляете ее только один раз (и присваиваете новой переменной newY), вы можете сэкономить немного времени (не уверен, что это действительно более эффективно, так как вы заканчиваете цикл по X, который может привести к когерентности кеширования вместо этого, особенно с большими изображениями).
  5. Мой компилятор (и стандарт C) жалуется на утверждение int maxColor = 256; в определении структуры; вы не можете инициализировать значение в typedef.
  6. Другие другие ошибки, поставленные компилятором.

Я взял на себя смелость исправить многие из них - это приводит к следующему коду, который появляется для компиляции и запуска; теперь вам нужно только добавить свои функции «входного изображения» и «выходного изображения» (возможно).

#include <stdio.h> 

//Setting the struct up for the pixels 
struct pixel 
{ 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
}; 

//Setting the struct up for the Image Type and scanning in the pixels into an array 
struct ImageType 
{ 
    char ppImage[3]; 
    char comment[256]; 
    char newlinechar; 
    int width; 
    int height; 
    int maxColor; // cannot initialize this here; removed "=256" 
    struct pixel image[100][100]; 
}; 


//Function in order to flip the image, going from the left most pixel flipping with the  right most 
void MirrorVertical(struct ImageType *imgur) // using a pointer to the struct 
{ 
    int x,y, height, width; // added declaration of height, width 
    // const int middle = imgur->width/2; // removed, not used 
    struct pixel tmp; // use same name here and in loop 
    height = imgur->height; // initialize once - save a redirect later 
    width = imgur->width; // ditto 
    for(y = 0; y < imgur->height/2; y++) // made this the outer loop 
    { 
    int newY = height - y - 1; // so we only compute it once 
    for(x=0; x < imgur->width; x++) 
    { 
     tmp = imgur->image[x][y]; // use "tmp" not "temp" 
     imgur->image[x][y] = imgur->image[x][newY]; 
     imgur->image[x][newY] = tmp; 
     } 
    } 
} 

// a simple main program… this doesn't really do anything except call the function 
int main(void) { 
struct ImageType i1; 
// … need to add code to import the image 
MirrorVertical(&i1); // note - passing POINTER to i1, not the entire struct 
// … need to add code to export the image 
} 

Сообщите мне, если это работает.

+0

да, точно, я пытаюсь вызвать первый struct, pixel и предоставить ему временный файл, а затем переключить его и вернуть его в p. –

+1

я определенно задумался над этим ... все, что я должен был сделать, это imgur.image [y] [x] = imgur.image [width-x] [y]; Извините .... ha –

+0

Вы смешиваете указатели и значения. Возможно, вы имеете в виду 'p = & tmp + y * imgur.width;'? – Floris

1

В этом случае: for(i=imageA.height-1; i <= 0; i--) be for(i=imageA.height-1; i >= 0; i--)? (в коде «сканирование в пикселях для первого изображения»)

+0

Я иду сверху вниз, так что вы начинаете с одного меньше высоты и колонки 0. Именно поэтому я имел <= вместо> = –

+0

@ user3078582 Но это значение должно быть положительным, не так ли? – yasen

+0

Я думал, что это должно быть отрицательно, потому что я каждый раз уменьшаюсь, потому что я выводил изображение сверху вниз. –