Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #include<math.h>
- #include <string.h>
- #define MAX_SZEROKOSC 1024
- struct OBRAZ {
- int x, y, skala;
- int **pixel;
- };
- struct OBRAZ *Moj_Pierwszy_Obraz(int, int, int);
- struct OBRAZ *Gradient_gora_dol(int, int, int);
- void Szum(struct OBRAZ*);
- struct OBRAZ* wczytaj(char*);
- void Negatyw(struct OBRAZ*);
- void Zapis(struct OBRAZ*);
- void UsunObraz(struct OBRAZ*);
- void Jaskrawosc(struct OBRAZ*);
- void Kontrast(struct OBRAZ* obraz);
- void Kontrast2(struct OBRAZ* obraz);
- int iloscCzarnychPikseli(struct OBRAZ* obraz);
- void menu();
- //void ZwalnianiePamieci(struct OBRAZ*);
- int main() {
- menu();
- /*
- printf("1) Gradient L->P 2) Gradient G->D\n");
- scanf("%d", &menu);
- if (menu == 1) {
- obraz = Moj_Pierwszy_Obraz(256, 256, 255);
- }
- else {
- obraz = Gradient_gora_dol(256, 256, 255);
- }
- Szum(obraz);
- Zapis(obraz);
- //Zapis(Moj_Pierszy_Obraz(256, 256, 255); <-to jest to samo co to wyĹźej
- //ZwalnianiePamieci(obraz);
- */
- system("pause");
- return 0;
- }
- void Szum(struct OBRAZ* obraz)
- {
- int i, j, tmp;
- srand(time(NULL));
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- tmp = (obraz->skala - obraz->pixel[i][j]);
- if (tmp == 0) {
- }
- else {
- tmp %= 20;
- obraz->pixel[i][j] += rand() % (tmp + 1);
- }
- }
- }
- }
- struct OBRAZ*Moj_Pierwszy_Obraz(int szer, int wys, int szar)
- {
- struct OBRAZ *wsk_na_str;
- int i, j;
- wsk_na_str = (struct OBRAZ*)malloc(sizeof(struct OBRAZ));
- wsk_na_str->x = szer;
- wsk_na_str->y = wys;
- wsk_na_str->skala = szar;
- wsk_na_str->pixel = (int**)calloc(wsk_na_str->x, sizeof(int));
- for (i = 0; i < wsk_na_str->x; i++)
- {
- wsk_na_str->pixel[i] = (int*)calloc(wsk_na_str->y, sizeof(int));
- }
- for (i = 0; i < wsk_na_str->x; i++) {
- for (j = 0; j < wsk_na_str->y; j++)
- {
- wsk_na_str->pixel[i][j] = j;
- }
- }
- return wsk_na_str;
- }
- struct OBRAZ*Gradient_gora_dol(int szer, int wys, int szar)
- {
- struct OBRAZ *wsk_na_str;
- int i, j;
- wsk_na_str = (struct OBRAZ*)malloc(sizeof(struct OBRAZ));
- wsk_na_str->x = szer;
- wsk_na_str->y = wys;
- wsk_na_str->skala = szar;
- wsk_na_str->pixel = (int**)calloc(wsk_na_str->x, sizeof(int));
- for (i = 0; i < wsk_na_str->x; i++)
- {
- wsk_na_str->pixel[i] = (int*)calloc(wsk_na_str->y, sizeof(int));
- }
- for (i = 0; i < wsk_na_str->x; i++) {
- for (j = 0; j < wsk_na_str->y; j++)
- {
- wsk_na_str->pixel[i][j] = i;
- }
- }
- return wsk_na_str;
- }
- void Zapis(struct OBRAZ *do_Zapisu)
- {
- int i, j;
- FILE *wsk;
- char bufor[MAX_SZEROKOSC];
- printf("Podaj nazwe pliku do zapisania: ");
- scanf("%s", bufor);
- wsk = fopen(bufor, "w");
- fprintf(wsk, "%s\n", "P2");
- //fprintf(wsk, "%s\n", "# komentarz");
- fprintf(wsk, "%d %d\n", do_Zapisu->x, do_Zapisu->y);
- fprintf(wsk, "%d\n", do_Zapisu->skala);
- for (j = 0; j < do_Zapisu->y; j++) {
- for (i = 0; i < do_Zapisu->x; i++) {
- fprintf(wsk, "%d ", do_Zapisu->pixel[j][i]);
- }
- fprintf(wsk, "\n");
- }
- fclose(wsk);
- }
- struct OBRAZ* wczytaj(char* nazwa) {
- int i, j, tmp;
- struct OBRAZ* obraz;
- char bufor[MAX_SZEROKOSC];
- FILE* plik;
- plik = fopen(nazwa, "r");
- if (plik == NULL) {
- printf("Nie udalo sie otworzyc pliku do odczytu\n");
- return NULL;
- }
- obraz = (struct OBRAZ*)calloc(1, sizeof(struct OBRAZ));
- if (obraz == NULL) {
- printf("Nie udalo sie zaalokowac pamieci na strukture\n");
- return NULL;
- }
- // wczytanie pierwszej linijki
- fgets(bufor, MAX_SZEROKOSC, plik);
- // sprawdzenie czy plik zaczyna sie od P2 lub P5
- if (!(bufor[0] == 'P' && (bufor[1] == '2' || bufor[1] == '5'))) {
- printf("Sprobowano otworzyc niewspierany format pliku\n");
- return NULL;
- }
- do {
- // wczytaj linijke
- fgets(bufor, MAX_SZEROKOSC, plik);
- // jezeli w linijce jest komentarz to przejdz na poczatek petli
- // i zostanie wczytana kolejna linijka
- if (strchr(bufor, '#')) {
- continue;
- }
- else { // jezeli w linijce nie ma # to wyjdz z petli
- break;
- }
- } while (1);
- // przesuniecie na poczatek poprzedniej linijki
- fseek(plik, ftell(plik) - strlen(bufor) - 1, SEEK_SET);
- // wczytanie informacji o szerokosci wysokosci i skali obrazu
- fscanf(plik, "%d%d%d", &obraz->x, &obraz->y, &obraz->skala);
- printf("Wczytano dane o obrazie x = %d y = %d skala = %d\n",
- obraz->x, obraz->y, obraz->skala);
- // zaalokowanie pamieci na pixele obrazu
- obraz->pixel = (int**)calloc(obraz->y, sizeof(int*));
- if (obraz->pixel == NULL) {
- printf("Nie udalo sie zaalokowac pamieci na wiersze.\n");
- return NULL;
- }
- for (i = 0; i < obraz->y; i++) {
- obraz->pixel[i] = (int*)calloc(obraz->x, sizeof(int));
- if (obraz->pixel[i] == NULL) {
- printf("Nie udalo sie zaalokwoac pamieci na kolumne.\n");
- return NULL;
- }
- }
- // wczytwanie pixeli z obrazu
- //printf("Wczytuje dane z obrazu: \n");
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- fscanf(plik, "%d", &tmp);
- obraz->pixel[i][j] = tmp;
- //printf("%5d", obraz->pixel[i][j]);
- }
- //printf("Wczytano linijke nr: %d\n", i + 1);
- //system("pause");
- }
- fclose(plik);
- return obraz;
- }
- void menu() {
- char nazwa[MAX_SZEROKOSC];
- int wybor;
- struct OBRAZ* aktualnyObraz;
- do {
- printf("Podaj nazwe pliku z rozszerzeniem: ");
- scanf("%s", nazwa);
- aktualnyObraz = wczytaj(nazwa);
- if (aktualnyObraz == NULL) {
- printf("Nie udalo sie otworzyc obrazu o podanej nazwie.\nSprobuj ponownie.\n");
- }
- else {
- printf("Wczytano poprawnie obraz.\n");
- break;
- }
- } while (1);
- do {
- printf("1) Zaszum\n2) Negatyw\n3) Jaskrawosc\n4) Kontrast \n5) Kontrast2 \n6) Ilosc czarnych pikseli\n7) Wyjscie\n");
- scanf("%d", &wybor);
- switch (wybor) {
- case 1:
- Szum(aktualnyObraz);
- break;
- case 2:
- Negatyw(aktualnyObraz);
- break;
- case 3:
- Jaskrawosc(aktualnyObraz);
- break;
- case 4:
- Kontrast(aktualnyObraz);
- break;
- case 5:
- Kontrast2(aktualnyObraz);
- break;
- case 6:
- printf("Ilosc czarnych pikseli = %d\n", iloscCzarnychPikseli(aktualnyObraz));
- break;
- }
- if (wybor != 7) {
- printf("Czy chcesz zapisac wynik? [1\\0]: ");
- scanf("%d", &wybor);
- if (wybor == 1) {
- Zapis(aktualnyObraz);
- }
- }
- } while (wybor != 7);
- UsunObraz(aktualnyObraz);
- }
- void Negatyw(struct OBRAZ* obraz) {
- int i, j;
- if (obraz == NULL) {
- printf("Wskaznik na obraz == NULL.\n");
- return;
- }
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- obraz->pixel[i][j] = obraz->skala - obraz->pixel[i][j];
- }
- }
- }
- void UsunObraz(struct OBRAZ* obraz) {
- int i;
- if (obraz == NULL) {
- printf("Wskaznik na obraz == NULL.\n");
- return;
- }
- for (i = 0; i < obraz->y; i++) {
- free(obraz->pixel[i]);
- }
- free(obraz->pixel);
- }
- void Jaskrawosc(struct OBRAZ* obraz) {
- int i, j, wartosc;
- printf("Podaj wartosc jaskrawosci: ");
- scanf("%d", &wartosc);
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- if (obraz->pixel[i][j] + wartosc > obraz->skala) {
- obraz->pixel[i][j] = obraz->skala;
- }
- else if (obraz->pixel[i][j] + wartosc < 0) {
- obraz->pixel[i][j] = 0;
- }
- else {
- obraz->pixel[i][j] = obraz->pixel[i][j] + wartosc;
- }
- }
- }
- }
- void Kontrast(struct OBRAZ* obraz) {
- int i, j, wartosc;
- printf("Podaj wartosc kontrastu: ");
- scanf("%d", &wartosc);
- // kontrast dla wartosci pixela wiekszej od polowy skali odejmuje podana wartosc
- // a dla wartosci pixela mniejszej od polowy skali dodaje wartosc
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- // rozjasnienie
- if (obraz->pixel[i][j] > obraz->skala / 2) {
- if (obraz->pixel[i][j] + wartosc > obraz->skala) {
- obraz->pixel[i][j] = obraz->skala;
- }
- else {
- obraz->pixel[i][j] += wartosc;
- }
- }
- else { // sciemnie
- if (obraz->pixel[i][j] - wartosc < 0) {
- obraz->pixel[i][j] = 0;
- }
- else {
- obraz->pixel[i][j] -= wartosc;
- }
- }
- }
- }
- }
- void Kontrast2(struct OBRAZ* obraz) {
- int i, j, wartosc;
- // kontrast dla wartosci pixela wiekszej od polowy skali odejmuje podana wartosc
- // a dla wartosci pixela mniejszej od polowy skali dodaje wartosc
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- // rozjasnienie
- if (obraz->pixel[i][j] > obraz->skala / 2)
- obraz->pixel[i][j] = obraz->skala;
- else {
- obraz->pixel[i][j] = 0;
- }
- }
- }
- }
- int iloscCzarnychPikseli(struct OBRAZ* obraz) {
- int i, j, ilosc = 0;
- for (i = 0; i < obraz->y; i++) {
- for (j = 0; j < obraz->x; j++) {
- if(obraz->pixel[i][j] == 0) {
- ilosc++;
- }
- }
- }
- return ilosc;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement