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 ...