Witam serdecznie!
Mam problem, potrzebuję usunąć niebieskie tło (a raczej wszystko, co nie jest koloru zielonego) z obrazka, który zamieszczam poniżej.
http://imgur.com/a/KE3AJ
Jest to obraz zapisany w formacie bitmapy (.bmp). Kod programu zamieszczam poniżej. Proszę o wskazówki, co zrobić (ewentualnie co zmienić w moim kodzie).
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;
typedef struct {
ushort Signature;
uint FileSize;
uint Reserved;
uint Offset;
} BMPFILEHEADER;
typedef struct {
uint HeaderSize;
uint Width;
uint Height;
ushort PlaneCount;
ushort BitDepth;
uint Compression;
uint CompressedImageSize;
uint HorizontalResolution;
uint VerticalResolution;
uint NumColors;
uint ImportantColors;
} BMPIMAGEINFO;
typedef struct {
uchar Blue;
uchar Green;
uchar Red;
} RGBs;
int main()
{
FILE *Image;
FILE *ChangedImage;
Image = fopen("1a15+50-107mg.bmp", "rb");
if (!Image)
{
return NULL;
}
BMPFILEHEADER *Header;
BMPIMAGEINFO *Info;
RGBs *RGB, **Pixel;
Header = (BMPFILEHEADER*)malloc(sizeof(BMPFILEHEADER));
Info = (BMPIMAGEINFO*)malloc(sizeof(BMPIMAGEINFO));
RGB = (RGBs*)malloc(sizeof(RGBs));
if (Header == NULL)
{
return NULL;
}
if (Info == NULL)
{
return NULL;
}
if (RGB == NULL)
{
return NULL;
}
fread(&Header->Signature, sizeof(Header->Signature), 1, Image);
fread(&Header->FileSize, sizeof(Header->FileSize), 1, Image);
fread(&Header->Reserved, sizeof(Header->Reserved), 1, Image);
fread(&Header->Offset, sizeof(Header->Offset), 1, Image);
fread(&Info->HeaderSize, sizeof(Info->HeaderSize), 1, Image);
fread(&Info->Width, sizeof(Info->Width), 1, Image);
fread(&Info->Height, sizeof(Info->Height), 1, Image);
fread(&Info->PlaneCount, sizeof(Info->PlaneCount), 1, Image);
fread(&Info->BitDepth, sizeof(Info->BitDepth), 1, Image);
fread(&Info->Compression, sizeof(Info->Compression), 1, Image);
fread(&Info->CompressedImageSize, sizeof(Info->CompressedImageSize), 1, Image);
fread(&Info->HorizontalResolution, sizeof(Info->HorizontalResolution), 1, Image);
fread(&Info->VerticalResolution, sizeof(Info->VerticalResolution), 1, Image);
fread(&Info->NumColors, sizeof(Info->NumColors), 1, Image);
fread(&Info->ImportantColors, sizeof(Info->ImportantColors), 1, Image);
ChangedImage = fopen("changed.bmp", "wb");
if (ChangedImage == NULL)
{
return NULL;
}
fwrite(&Header->Signature, sizeof(Header->Signature), 1, ChangedImage);
fwrite(&Header->FileSize, sizeof(Header->FileSize), 1, ChangedImage);
fwrite(&Header->Reserved, sizeof(Header->Reserved), 1, ChangedImage);
fwrite(&Header->Offset, sizeof(Header->Offset), 1, ChangedImage);
fwrite(&Info->HeaderSize, sizeof(Info->HeaderSize), 1, ChangedImage);
fwrite(&Info->Width, sizeof(Info->Width), 1, ChangedImage);
fwrite(&Info->Height, sizeof(Info->Height), 1, ChangedImage);
fwrite(&Info->PlaneCount, sizeof(Info->PlaneCount), 1, ChangedImage);
fwrite(&Info->BitDepth, sizeof(Info->BitDepth), 1, ChangedImage);
fwrite(&Info->Compression, sizeof(Info->Compression), 1, ChangedImage);
fwrite(&Info->CompressedImageSize, sizeof(Info->CompressedImageSize), 1, ChangedImage);
fwrite(&Info->HorizontalResolution, sizeof(Info->HorizontalResolution), 1, ChangedImage);
fwrite(&Info->VerticalResolution, sizeof(Info->VerticalResolution), 1, ChangedImage);
fwrite(&Info->NumColors, sizeof(Info->NumColors), 1, ChangedImage);
fwrite(&Info->ImportantColors, sizeof(Info->ImportantColors), 1, ChangedImage);
int i, j;
Pixel = (RGBs**)malloc(sizeof(RGBs*) * Info->Height);
for (i = 0; i < Info->Height; i++)
{
Pixel[i] = (RGBs*)malloc(sizeof(RGBs)*Info->Width);
}
// tutaj nastepuje odczyt i sprawdzenie w instrukcji warunkowej, czy jestesmy na kolorze innym niz zielony - jesli tak to zmieniamy kolor na bialy (255,255,255) i zapisujemy w nowej
bitmapie
for (i = 0; i < Info->Height; i++)
{
for (j = 0; j < Info->Width; j++)
{
fread(&Pixel[i][j].Blue, sizeof(RGB->Blue), 1, Image);
fread(&Pixel[i][j].Green, sizeof(RGB->Green), 1, Image);
fread(&Pixel[i][j].Red, sizeof(RGB->Red), 1, Image);
if (Pixel[i][j].Green < 30)
{
Pixel[i][j].Blue = 255;
Pixel[i][j].Green = 255;
Pixel[i][j].Red = 255;
}
fwrite(&Pixel[i][j].Blue, sizeof(RGB->Blue), 1, ChangedImage);
fwrite(&Pixel[i][j].Green, sizeof(RGB->Green), 1, ChangedImage);
fwrite(&Pixel[i][j].Red, sizeof(RGB->Red), 1, ChangedImage);
}
}
printf("Typ: %x", Header->Signature);
printf("\nRozmiar pliku : %d bajtow", Header->FileSize);
printf("\nZarezerwowane miejsca: %d", Header->Reserved);
printf("\nPozycja danych obrazkowych: %d", Header->Offset);
printf("\n\nWielkosc naglowka informacyjnego: %d", Info->HeaderSize);
printf("\nSzerokosc: %d pikseli", Info->Width);
printf("\nWysokosc: %d pikseli", Info->Height);
printf("\nLiczba platow (zwykle 0): %d", Info->PlaneCount);
printf("\nLiczba bitow na piksel: %d", Info->BitDepth);
printf("\nKompresja: %d", Info->Compression);
printf("\nRozmiar samego rysunku: %d", Info->CompressedImageSize);
printf("\nRozdzielczosc pozioma: %d", Info->HorizontalResolution);
printf("\nRozdzielczosc pionowa: %d", Info->VerticalResolution);
printf("\nLiczba kolorow w palecie: %d", Info->NumColors);
printf("\nWazne kolory w palecie: %d", Info->ImportantColors);
free(Header);
free(Info);
free(RGB);
free(Pixel);
fclose(Image);
fclose(ChangedImage);
return 0;
}