Ich bin vor kurzem auschecken C für einen Freund Probleme mit ihm für die Schule. Da ich nur Java und C# gelernt habe, wäre es doch einfach. Aber momentan stecken wir darauf fest.C Bitmap: Rotation und Zoom
Ich habe ein Projekt lesen ein kleines BMP (512x512) Bild. Ich habe es geschafft, ein paar Farben zu ändern und sie zu drehen (sowohl horizontal als auch vertikal). Obwohl ich bei der -90 ° Rotation feststecke.
1. ROTATION (512x512)
Zur Zeit habe ich diesen Code (beide getPixel und setPixel sind meine eigenen Funktionen):
typedef struct _bitmap {
char file_path[PATH_MAX+1];
char magic_number[3];
unsigned int size;
unsigned char application[5];
unsigned int start_offset;
unsigned int bitmapHeaderSize;
unsigned int width;
unsigned int height;
unsigned short int depth;
unsigned char* header;
PIXEL* raster;
} BITMAP;
void rotate(BITMAP* bmp) {
int i;
int j;
PIXEL* originalPixel;
BITMAP* originalBmp;
deepCopyBitmap(bmp, originalBmp);
for(j=1; j <= bmp->height; j++) {
for(i=1; i <= bmp->width; i++) {
originalPixel=getPixel(originalBmp->raster, bmp->width, bmp->height, j, i);
setPixel(bmp->raster, bmp->width, bmp->height, (bmp->width + 1 - i), j, originalPixel);
}
}
}
void deepCopyBitmap(BITMAP* bmp, BITMAP* copy) {
*copy = *bmp;
if (copy->raster) {
copy->raster = malloc(copy->height * sizeof(*copy->raster));
for (int i = 0; i < copy->height; i++) {
copy->raster[i] = malloc(copy->width * sizeof(*copy->raster[i]));
memcpy(copy->raster[i], bmp->raster[i], copy->width * sizeof(*copy->raster[i]));
}
}
}
indirection requires pointer operand ('PIXEL' (aka 'struct _pixel') invalid)
copy->raster[i] = malloc(copy->width * sizeof(*copy->raster[i]));
^~~~~~~~~~~~~~~~
indirection requires pointer operand ('PIXEL' (aka 'struct _pixel') invalid)
memcpy(copy->raster[i], bmp->raster[i], copy->width * sizeof(*copy->raster[i]));
^~~~~~~~~~~~~~~~
expanded from macro 'memcpy' __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest))
Dies dreht richtig die erste Diagonale Teil des Bildes, aber der zweite Teil ist völlig falsch (zweimal ein Teil der ersten Diagonale).
Ich denke, das Problem ist, tauschen Pixel um und auf halbem Weg beginne ich bereits vertauschte Pixel zu tauschen. Also habe ich versucht, meine BMP zu einer Original-Bitmap (originalBmp) und einer gedrehten (gedrehtenBmp) zu duplizieren. Obwohl ich denke, es kopiert nur die Referenz. Jeder hat eine Idee, wie ich ein Duplikat bmp erstellen?
As example (sorry für den Rauch img): Ich möchte die vertikalen Linien (links), drehen -90deg, so wird es horizontale Linien (rechts). Obwohl der linke diagonale Teil korrekt ist. Aber der rechte Teil der Diagonale ist falsch, wenn ein Stück der linken Diagonale kopiert wird. Ich denke, weil es Pixel tauscht, die bereits in der BMP-Datei ausgetauscht werden.
2. ROTATION (512x1024)
Was passiert, wenn die Höhe oder Breite das Doppelte der anderen ist? Jeder weiß, wie man damit anfängt?
3. ZOOM (200%)
Wer weiß, wie dies zu tun? Holen Sie die mittleren Pixel der Bitmap, und machen Sie sie zweimal am Anfang des Bildes, oder gibt es eine bessere/sauberere Lösung?
1 2 3 4 5 6 7 8 3 3 4 4 5 5 6 6
2 2 3 4 5 6 7 8 3 3 4 4 5 5 6 6
3 3 3 4 5 6 7 8 4 4 4 4 5 5 6 6
4 4 4 4 5 6 7 8 4 4 4 4 5 5 6 6
5 5 5 5 5 6 7 8 5 5 5 5 5 5 6 6
6 6 6 6 6 6 7 8 5 5 5 5 5 5 6 6
7 7 7 7 7 7 7 8 6 6 6 6 6 6 6 6
8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6
Zoom von 200 % == verdoppeln jedes Pixel in beide Richtungen, also wird jedes vier. Hängt von der Implementierung ab, wenn das Ergebnis größer oder nur ein beschnittenes Teil sein soll. Nicht Rechteck, hängt wieder von der Implementierung ab. –
Ich kenne die 'setPixel'- und' getPixel'-Funktionen nicht, aber ich finde es merkwürdig, dass die Indizes ('i' und' j') bei 1 beginnen. Ist das absichtlich? In C würden Sie normalerweise von 0 ausgehen. – 4386427
Haben Sie den Code mit einem Debugger ausgeführt, indem Sie alle relevanten Variablen überprüft haben? – alk