Wie kann ich sachen rotiren ?????????
-
Hallo,
Ich wolte mal fragen wie man bilder/graphiken (von c++ aus) rotieren kann (1°-360°)
Bitte schreibt mor ein Beischpiel.Jetzt schon : vielen dank für die antworten
-
Hallo
Jedenfalls nicht mit dem Builder. Ich weiß grad nicht ob die WinAPI entsprechende Funktionen bereitstellt, aber wahrscheinlich must du dir eine externe Grafik-Bibliothek einbinden. Schau also am besten im Grafik-Forum nach.
bis bald
akari
-
GDI+ bietet einige Möglichkeiten dafür.
-
Schau mal z.B. hier. Wenn Du dort nichts finden solltest, was zu Deiner BCB-Version passt, dann schau mal in die FAQ, wo Du noch nach anderen Komponenten suchen könntest.
-
akari schrieb:
Hallo
Jedenfalls nicht mit dem Builder. Ich weiß grad nicht ob die WinAPI entsprechende Funktionen bereitstellt, aber wahrscheinlich must du dir eine externe Grafik-Bibliothek einbinden. Schau also am besten im Grafik-Forum nach.
bis bald
akariWieso nicht mit CBuilder?
Sollte mit WinAPI gehen oder im CBuilder direkt (BCB 4.0):Quell und Zielbild GLEICH gross
Beide Bilder pf24bit
RotAngle in Bogenmass !!!
ZoomFac kann 1.0 seinvoid __fastcall CalculateRotation(double &XOrgDbl, double &YOrgDbl, double SinAngle, double CosAngle) { double XNew,YNew; XNew=XOrgDbl * CosAngle - YOrgDbl * SinAngle; YNew=YOrgDbl * CosAngle + XOrgDbl * SinAngle; XOrgDbl=XNew; YOrgDbl=YNew; } void __fastcall RotateTransform(Graphics::TBitmap *BMOrg,Graphics::TBitmap *BMDest,double RotAngle, double ZoomFac, Boolean Interpolate) { double SinAngle,CosAngle; int X,Y,XOrg,YOrg; double XOrgDbl,YOrgDbl; int R,G,B; double DXOrgDbl,DYOrgDbl; double Eins_DXOrgDbl,Eins_DYOrgDbl; PRGBTriple DestRow,OrgRow,OrgRowNext; PRGBTriple *POrgRow=NULL; int BMWidth=BMOrg->Width; int BMHeight=BMOrg->Height; int BMW_2=BMWidth / 2; int BMH_2=BMHeight / 2; BMOrg->PixelFormat=pf24bit; BMDest->PixelFormat=pf24bit; SinAngle=sin(RotAngle); CosAngle=cos(RotAngle); try { BMDest->Width=BMWidth; BMDest->Height=BMHeight; POrgRow=(PRGBTriple*)malloc(sizeof(PRGBTriple) * BMHeight); if (POrgRow!=NULL) { for (int Zeile=0;Zeile<BMHeight;Zeile++) { POrgRow[Zeile]=(PRGBTriple)BMOrg->ScanLine[Zeile]; } for (Y=0;Y<BMHeight;Y++) { DestRow=(PRGBTriple)BMDest->ScanLine[Y]; for (X=0;X<BMWidth;X++) { XOrgDbl=(X - BMW_2) / ZoomFac; YOrgDbl=(Y - BMH_2) / ZoomFac; CalculateRotation(XOrgDbl,YOrgDbl,SinAngle,CosAngle); XOrgDbl=XOrgDbl + BMW_2; YOrgDbl=YOrgDbl + BMH_2; XOrg=int(XOrgDbl); YOrg=int(YOrgDbl); if ((XOrg>=0) && (YOrg>=0) && (XOrg<BMWidth) && (YOrg<BMHeight)) { OrgRow=POrgRow[YOrg]; if (Interpolate) { if (YOrg<(BMHeight - 1)) { OrgRowNext=POrgRow[YOrg + 1]; } else { OrgRowNext=NULL; } //Interpolation ueber 2 Zeilen if (OrgRowNext!=NULL) { //Interpolation ueber 4 Pixel / 2 Zeilen if (XOrg<(BMWidth - 1)) { DXOrgDbl=XOrgDbl - XOrg; DYOrgDbl=YOrgDbl - YOrg; Eins_DXOrgDbl=1-DXOrgDbl; Eins_DYOrgDbl=1-DYOrgDbl; R=(OrgRow[XOrg].rgbtRed * (Eins_DXOrgDbl)+ OrgRow[XOrg + 1].rgbtRed * DXOrgDbl) * (Eins_DYOrgDbl); G=(OrgRow[XOrg].rgbtGreen * (Eins_DXOrgDbl) + OrgRow[XOrg + 1].rgbtGreen * DXOrgDbl) * (Eins_DYOrgDbl); B=(OrgRow[XOrg].rgbtBlue * (Eins_DXOrgDbl) + OrgRow[XOrg + 1].rgbtBlue * DXOrgDbl) * (Eins_DYOrgDbl); R=R + (OrgRowNext[XOrg].rgbtRed * (Eins_DXOrgDbl)+ OrgRowNext[XOrg + 1].rgbtRed * DXOrgDbl) * DYOrgDbl; G=G + (OrgRowNext[XOrg].rgbtGreen * (Eins_DXOrgDbl) + OrgRowNext[XOrg + 1].rgbtGreen * DXOrgDbl) * DYOrgDbl; B=B + (OrgRowNext[XOrg].rgbtBlue * (Eins_DXOrgDbl) + OrgRowNext[XOrg + 1].rgbtBlue * DXOrgDbl) * DYOrgDbl; DestRow[X].rgbtRed=(unsigned char)R; DestRow[X].rgbtGreen=(unsigned char)G; DestRow[X].rgbtBlue=(unsigned char)B; } //Interpolation ueber 2 Pixel/ 2 Zeilen else { DestRow[X].rgbtRed=OrgRow[XOrg].rgbtRed; DestRow[X].rgbtGreen=OrgRow[XOrg].rgbtGreen; DestRow[X].rgbtBlue=OrgRow[XOrg].rgbtBlue; } } //Interpolation ueber 1 Zeile else { //interpolation ueber 2 Pixel / 1 Zeile if (XOrg<(BMWidth - 1)) { DXOrgDbl=XOrgDbl - XOrg; DYOrgDbl=YOrgDbl - YOrg; Eins_DXOrgDbl=1-DXOrgDbl; Eins_DYOrgDbl=1-DYOrgDbl; R=OrgRow[XOrg].rgbtRed * (Eins_DXOrgDbl)+ OrgRow[XOrg + 1].rgbtRed * DXOrgDbl; G=OrgRow[XOrg].rgbtGreen * (Eins_DXOrgDbl) + OrgRow[XOrg + 1].rgbtGreen * DXOrgDbl; B=OrgRow[XOrg].rgbtBlue * (Eins_DXOrgDbl) + OrgRow[XOrg + 1].rgbtBlue * DXOrgDbl; DestRow[X].rgbtRed=(unsigned char)R; DestRow[X].rgbtGreen=(unsigned char)G; DestRow[X].rgbtBlue=(unsigned char)B; } //keine Interpolation else { DestRow[X].rgbtRed=OrgRow[XOrg].rgbtRed; DestRow[X].rgbtGreen=OrgRow[XOrg].rgbtGreen; DestRow[X].rgbtBlue=OrgRow[XOrg].rgbtBlue; } } } else { DestRow[X].rgbtRed=OrgRow[XOrg].rgbtRed; DestRow[X].rgbtGreen=OrgRow[XOrg].rgbtGreen; DestRow[X].rgbtBlue=OrgRow[XOrg].rgbtBlue; } } else { DestRow[X].rgbtRed=0; DestRow[X].rgbtGreen=0; DestRow[X].rgbtBlue=0; } } } } else { //Fehler aufgetreten } } catch(...) { } }
-
Hallo
Ja man kann sich natürlich auch im Builder eine eigene Rotationsfunktion schreiben. Ich dachte aber eher an eine schon vorhandene Funktion, und da bietet die VCL nichts. Da ich nicht nicht wußte ob WinAPI eine hat hab ich dann gleich an richtige Grafik-Libs verwiesen.
bis bald
akari