Bild rotieren



  • Hallo Leute,

    würde gerne ein Bild (.jpg, .bmp) rotieren (90°links/rechts). Mehr nicht! 😉

    Geht das mit TJpegImage/TImage/TBitmap oder kann Canvas sowas??

    In der BCB Hilfe steht unter TBitmap:

    "...TBitmap contains an internal image of the bitmap graphic and automatically manages realization of the palette when drawn. A bitmap is a powerful graphics object used to create, manipulate (scale, scroll, rotate, and paint), and store images in memory and as files on a disk. ...

    Daraus schließe ich, dass es irgendwie gehen könnte. Allerdings bin ich weder in der BCB Hilfe, noch hier im Forum oder Faq weitergekommen. Oder bleibt mir nichts anderes, als mich mit WinApi zu beschäftigen?

    Danke schonmal, Gruß
    Timmy



  • Über TBitmap::Canvas::Pixels erhältst du direkten Zugriff auf die einzelnen Bildpunkte. Den Algorithmus zur Rotation musst du selbst implementieren, was aber nicht wirklich kompliziert ist.

    Später kannst du dann zur Perfomanceoptimierung TBitmap::ScanLine statt TCanvas::Pixels verwenden, das ist allerdings ein wenig komplizierter.



  • AnsiString TEMPNAME; 
        Screen->Cursor=crHourGlass; 
        //rechts drehen 
        AnsiString OPEN_FILE,SAVE_NAME; 
        OPEN_FILE=Edit4->Text; 
    
        if(!(OPEN_FILE == "KEIN_BILD_GEWÄHLT")) 
        { 
          TJPEGImage *obj  = new TJPEGImage(); 
    
          TEMPNAME=ExtractFileDir(OPEN_FILE) + "\\temp\\" +  Get_B_Name(ExtractFileName(OPEN_FILE)); 
    
          if(FileExists(TEMPNAME)) 
          { 
            EIGENE_MESSAGEBOX_BEARBEITETES_BILD_SCHNELLDREHEN(); 
          }// if(FileExists(TEMPNAME)) 
          else 
          { 
               obj->LoadFromFile(OPEN_FILE); 
               Graphics::TBitmap* BildQuelle; 
               Graphics::TBitmap* BildZiel; 
               RGBTRIPLE *ptr; 
               RGBTRIPLE *newscanline; 
    
               BildQuelle              = new Graphics::TBitmap; 
               BildZiel                = new Graphics::TBitmap; 
               BildQuelle->PixelFormat = pf24bit; 
               BildQuelle->Assign(obj); 
               BildZiel->PixelFormat   = pf24bit; 
               BildZiel->Palette       = BildQuelle->Palette; 
               BildZiel->Height        = BildQuelle->Width; 
               BildZiel->Width         = BildQuelle->Height; 
    
               //--------- 
    
               for (int y = 0; y < BildQuelle->Width; y++) 
               { 
                   newscanline = static_cast<RGBTRIPLE*>(BildZiel->ScanLine[y]); 
    
                   for (int x = 0; x < BildQuelle->Height; x++) 
                   { 
                     ptr = static_cast<RGBTRIPLE*>(BildQuelle->ScanLine[x]); 
                     newscanline[BildQuelle->Height-1 - x] = ptr[y]; 
                   } 
               } 
    
               obj->Assign(BildZiel); 
               DeleteFile(OPEN_FILE); 
               obj->SaveToFile(OPEN_FILE); 
               delete obj; 
               delete BildQuelle; 
               delete BildZiel; 
               BT_BILDGROESSE_UEBERNEHMEN->Click(); 
    
           }//else if(FileExists(TEMPNAME)) 
    
        }//if(!(OPEN_FILE == "KEIN_BILD_GEWÄHLT")) 
        else 
        { 
          ShowMessage(" Sie Haben kein Bild ausgewählt"); 
        } 
        Screen->Cursor=crArrow;
    

    Das hatte ich schonmal gepostet, aber ich weiss nicht wie ich dahin verlinke 🤡



  • Moin,

    dankeschön... Probiere noch mit der Pixelsgeschichte rum. Werde dein Beispiel aber auf jeden Fall auch nochmal probieren!

    Wäre das Thema nicht auch mal was für die FAQ??

    Gruß
    Timmy



  • Hi,

    ich würde direkt die Scanline-Routine verwenden, es ist DEUTLICH schneller (kann Dir keine genaue Zahl sagen, aber so ca. 100 Mal)...


Anmelden zum Antworten