Rotieren eines Bildes um 90°
-
Grau ist alle Theorie.
TJPEGImage *jp = new TJPEGImage(); try { jp->LoadFromFile("c:\\bild1.jpg"); Graphics::TBitmap *tgtbmp = new Graphics::TBitmap(); Graphics::TBitmap *srcbmp = new Graphics::TBitmap(); srcbmp->Assign(jp); tgtbmp->Height = srcbmp->Width; tgtbmp->Width = srcbmp->Height; tgtbmp->PixelFormat = pf32bit; srcbmp->PixelFormat = tgtbmp->PixelFormat; int *tgtptr, *srcptr; for( int y = 0; y < tgtbmp->Height; y++) { tgtptr = (int*)tgtbmp->ScanLine[y]; for(int x = 0; x < tgtbmp->Width; x++) { srcptr = (int*)srcbmp->ScanLine[x]; tgtptr[x] = srcptr[y]; } } Image1->Picture->Bitmap = tgtbmp; delete tgtbmp; delete srcbmp; } catch(Exception &E) { MessageBox(0, (E.Message).c_str(), String(E.ClassName()).c_str(), MB_ICONSTOP); } delete jp;Warum hier nicht nur gedreht sondern auch noch gespiegelt wird solltest du mit etwas logischem Denken selbst herausbekommen. Schliesslich wollen wir es ja nicht zu einfach machen.

-
Habe auf einer Buch-CD noch 90°-Drehprogramm (WinApi nah) gefunden.
(Buch heisst "Borland Builder im Team")void __fastcall TForm1::Button1Click(TObject *Sender) { HDC dc=GetDC(0); TMemoryStream *astream; astream = new TMemoryStream; astream->SetSize( sizeof (BITMAPINFOHEADER) + Image1->Picture->Bitmap->Height *((long)(Image1->Picture->Bitmap->Width+4) * 3)); TMemoryStream *bstream; bstream = new TMemoryStream; bstream->SetSize( sizeof (BITMAPINFOHEADER) + Image1->Picture->Bitmap->Height *((long)(Image1->Picture->Bitmap->Width+4) * 3)); BITMAPINFOHEADER *bmih; bmih = (BITMAPINFOHEADER*)astream->Memory; bmih->biSize = 40; bmih->biWidth = Image1->Picture->Bitmap->Width; bmih->biHeight = Image1->Picture->Bitmap->Height; bmih->biPlanes = 1; bmih->biBitCount = 24; bmih->biCompression = BI_RGB; bmih->biSizeImage = 0; bmih->biXPelsPerMeter = 10000; bmih->biYPelsPerMeter = 10000; bmih->biClrUsed =0; bmih->biClrImportant =0; bmih = (BITMAPINFOHEADER*)bstream->Memory; bmih->biSize = 40; bmih->biWidth = Image1->Picture->Bitmap->Height; bmih->biHeight = Image1->Picture->Bitmap->Width; bmih->biPlanes = 1; bmih->biBitCount = 24; bmih->biCompression = BI_RGB; bmih->biSizeImage = 0; bmih->biXPelsPerMeter = 10000; bmih->biYPelsPerMeter = 10000; bmih->biClrUsed =0; bmih->biClrImportant =0; unsigned char *aptr; aptr = (unsigned char*)astream->Memory +sizeof (BITMAPINFOHEADER); unsigned char *bptr; bptr = (unsigned char*)bstream->Memory +sizeof (BITMAPINFOHEADER); int I=GetDIBits(dc, Image1->Picture->Bitmap->Handle, 0,Image1->Picture->Bitmap->Height, aptr, (BITMAPINFO*)astream->Memory, DIB_RGB_COLORS); int linewidth = (Image1->Picture->Bitmap->Width*3); linewidth = linewidth+(linewidth % 4==0?0:4-linewidth % 4); int blinewidth = (Image1->Picture->Bitmap->Height*3); blinewidth = blinewidth+(blinewidth % 4==0?0:4-blinewidth % 4); if (I > 0) { int j,k; unsigned char *ptr1; unsigned char *ptr2; for (j=0;j<Image1->Picture->Bitmap->Height;j++) { for (k=0;k<Image1->Picture->Bitmap->Width;k++) { ptr1 = aptr + + j*linewidth + k * 3; ptr2 = bptr + + k* blinewidth + (Image1->Picture->Bitmap->Height -j) *3; memcpy(ptr2,ptr1,3); } } } Image1->Picture->Bitmap->Handle = CreateDIBitmap(dc, (BITMAPINFOHEADER*)bstream->Memory, CBM_INIT , bptr, (BITMAPINFO*)bstream->Memory, DIB_RGB_COLORS); astream->Free(); bstream->Free(); ReleaseDC(0,dc); }
-
OK, danke ihr habt mir gut geholfen, mitlerweile klappt alles, bis dann
Gruß
Tolga