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


Anmelden zum Antworten