Siemka, chciałem wykonać następujące zadanie: Napisz program, który w pliku bmp podzieli obraz na 9 części (dzieląc wysokość na 3 równe części i szerokość podobnie)i część środkową pokoloruj na zadany kolor. Podobną procedurę powtórz dla pozostałych 8 elementów.
Wykładowca pokazał nam następujący kod:
#include<iostream>
#include<fstream>
#include<windows.h>
using namespace std;
void przetworzBMP(ifstream &s)
{
BITMAPFILEHEADER bmpFile;
BITMAPINFOHEADER bmpInfo;
if (s.is_open())
{
//pobranie naglowka zajmuje 14 bajtow i 40 bajtow
s.read((char*)&bmpFile, 14);
s.read((char*)&bmpInfo, 40);
//wydobycie informacji o rozmiarze pliku
int szerokosc = bmpInfo.biWidth;
int wysokosc = bmpInfo.biHeight;
//dlugosc kazdego wiersza musi byc podzelna przez 4 - wiersz dopelniany jest zerami :-)
int dopelnienie = 4-(3*szerokosc) % 4;
cout << "szer=" << szerokosc<<endl;
cout << "dop=" << dopelnienie << endl;
int iloscDanych = bmpFile.bfSize - 14 - 40;
//rezerwuje miejsce na zawartosc mapy bitow
unsigned char* dane = new unsigned char[iloscDanych];
//wczytanie danych
s.read((char*)dane, iloscDanych);
s.close();
//utworzenie nowego pliku ze zmienionym kolorem
ofstream nowy("klon.bmp");
//kopiowani naglowków
nowy.write((char*)&bmpFile, 14);
nowy.write((char*)&bmpInfo, 40);
//transformacja bitow
unsigned char* wsk = dane;
for (int i = 0; i < wysokosc; i++)
{
for (int j = 0; j < szerokosc; j++)
{
*wsk = (byte)255;
*(wsk+1) = (byte)0;
*(wsk+2) = (byte)100;
wsk += 3;
}
wsk += dopelnienie;
}
nowy.write((char*)dane, iloscDanych);
nowy.close();
delete[] dane;
}
}
int main()
{
ifstream bmp("examp.bmp");
przetworzBMP(bmp);
system("PAUSE");
}
Maluje on całe zdjęcie na niebieski kolor.
Zauważyłem, że jesli zmienię na wysokosc/3 to poprostu pomaluję ten obrazek zaczynając od dołu na 1/3 wyskosci na kolor niebieski. Po zmianie będzie tak:
for (int i = 0; i < wysokosc/3; i++)
{
for (int j = 0; j < szerokosc; j++)
{
*wsk = (byte)255;
*(wsk+1) = (byte)0;
*(wsk+2) = (byte)100;
wsk += 3;
}
wsk += dopelnienie;
}
Teraz mam pytanie w jaki sposob mogę pomalować np 1/3 ale szerokosci obrazka ? Poprostu chodzi mi o to aby rysowało na kolor niebieski 1/3 obrazka, lecz nie dzieląc wyskosci na 3 tylko szerokosc; Odrazu mówię , że zmienienie poprostu na szerokosc/3 w petli nie działa. Pojawiają się dziwne paski na calej szerokosci. Chcę poprostu dojść do tego by móc podzielić ten kod na 9 kawałków a potem sobie malować dowolny z nich. Tak jak w poleceniu powyżej. Jeśli ktoś mogłby mi to napisać jak to zrobic, bede mega wdzieczny. Pozdrawiam