[BCB/C++]Obrót pliku BMP 24bit o 90stopni

0
int TChild::Obrot90(Byte * zrodlo){

{
   SzerMapy = ClientWidth;
   WysMapy = ClientHeight;
   IloscKolorow = 0;

   // ilosc bajtow wiersza w obrazie (docelowego, zrodlowego)
   // zaokraglamy do wielokrotnosci 4 bajtow!
   int RozmWierDo = ceil(3.0 *SzerMapy / 4.0) * 4;
   int RozmWierZr = ceil(3.0 *SzerMapy / 4.0) * 4;


   long bmpsize = sizeof(BITMAPINFOHEADER)
        + sizeof(RGBQUAD) * IloscKolorow
        + RozmWierDo * SzerMapy; //wysmapy

   mapaDIB = new Byte[bmpsize];


   LPBITMAPINFOHEADER bmih = (LPBITMAPINFOHEADER) mapaDIB;

   bmih->biSize = sizeof(BITMAPINFOHEADER);
   bmih->biWidth = SzerMapy;
   bmih->biHeight = WysMapy;
   bmih->biPlanes = 1;
   bmih->biBitCount = 24;
   bmih->biCompression = BI_RGB;
   bmih->biSizeImage = 0;
   bmih->biClrUsed = 0;
   bmih->biClrImportant = 0;


int r,g,b;
dane = (Byte *) mapaDIB
      + sizeof(BITMAPINFOHEADER)
      + sizeof(RGBQUAD) * IloscKolorow;


   Byte * wskZr =zrodlo;
   Byte * wskDo = dane;

  for (unsigned int j = 0; j < WysMapy ; j++)
{
for (unsigned int i = 0 ; i < SzerMapy; i++)
{

         wskDo[(WysMapy-i)*RozmWierZr+j*3] = wskZr[3*i];
              wskDo[(WysMapy-i)*RozmWierZr+j*3+1] = wskZr[3*i+1];
              wskDo[(WysMapy-i)*RozmWierZr+j*3+2] = wskZr[3*i+2];

      }
     wskZr += RozmWierZr;
    // wskDo -= RozmWierDo;
}

 HDC kont = GetDC(Handle);


   hMapa = CreateDIBitmap(kont, bmih, CBM_INIT, dane, (LPBITMAPINFO) bmih, DIB_RGB_COLORS);
   ReleaseDC(Handle, kont);

   return 1;
}

}

Mam sobie taki kod, obraca on obrazek BMP 24bit o kąt 90 stopni zgodnie z ruchem wskazówek zegara. Wszystko fajnie działa dla plików gdzie wysokosc=szerokosc. Natomiast dla plików wysokosc!=szerokosc, program wykrzacza się krzycząc Access Violation i tworzy jedynie pustą, odwróconą formę :/

Coż mam począć ? Co jest źle ? Nie mogę użyć żadnych wbudowanych funkcji typu ScanLine :/

Tak więc... pomocy ...

0

dodac druga bitmape

i tam wrzucac obrocony obrazek ale ma miec odpowiednie wymiary
obroc sobie poddstawowy obrazek o kat i wylicz wymiary bitmapy

0

Z całym szacunkiem, ale nie rozumiem odpowiedzi.

Wymiary bmp mam, zamieniam po prostu szerokosc na wysokosc etc.

w/w kod, otwiera nowe okiengo MDI Child z odwróconą bitmapą. Nie wiem czy poprawnie obliczam rozmiar nowej bmp :/ Nie mniej jednak kod działa dla obrazów z wysokosc=szerokosc, krzaczy sie natomiast dla wysokosc!=szerokosc - i to stanowi problem.

0

Fajnie by było gdynyś poczytał trochę o formacie bmp - linie mają być w pamięci wyrównane do 4 bajtów, Ty sobie zaś beztrosko indeksujesz bez tego... W ogóle to poczytaj jak się prawidłowo pobiera pozycję pikseli w obrazie.

0

Z checia poczytam, podaj linki a na pewno przeczytam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1