私は最近、学校に問題がある友人のCをチェックアウトしています。私はJavaとC#を学んだだけですが、それは簡単でしょう。しかし、現在これに固執しています。Cビットマップ:回転とズーム
私は小さなbmp(512x512)イメージを読んでいるプロジェクトがあります。私はそれにいくつかの色を変更し、それを回転させることに成功しました。私は-90°の回転で立ち往生しています。
1. ROTATION(512×512)
現在、私は(getPixelメソッドととsetPixel両方が自分自身の関数です)、このコードを持っている:
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))
これは正しく画像の最初の対角の部分を回転させ、第2部分は完全に間違っている(第1対角線の2倍の部分を有する)。
私は問題は、周囲のピクセルを交換し、途中で既に交換されたピクセルを交換し始めていると思います。だから、オリジナルのビットマップ(originalBmp)と1つのrotate(rotateBmp)に、私のbmpを複製しようとしました。私はそれが単に参照をコピーすると思うが。 誰でも私はどのようにbmpを重複して作成する考えがありますか?
As example(腹筋のため申し訳ありません):私は垂直線(左)を-90度回転させたいので、水平線(右)になります。左斜めの部分は正しいですが。しかし、対角線の右部分は、左斜めの部分をコピーすることが間違っています。私はそれが既にbmpファイルでスワップされているピクセルを交換するためだと思います。
2. ROTATION高さや幅が他の倍である場合はどうなりますか(512x1024)
?誰もがこれを始める方法を知っていますか?
3. ZOOM(200%)
これを行う方法を誰もが知っていますか?ビットマップの中央のピクセルを取得し、イメージの開始時に2回作成するか、より良い/よりクリーンなソリューションがありますか?あなたのコードから
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
ズーム200によって、それはこのようなものになる可能性があり、単純マトリクスについては
%==両方向のピクセルごとに2倍になるので、それぞれが4になります。結果がより大きくなるように、または切り取った部分だけを望む場合は、実装に依存します。矩形ではなく、実装にも依存します。 –
'setPixel'と' getPixel'関数は分かりませんが、インデックス( 'i'と' j')が1から始まるのは奇妙です。 Cでは、通常0から開始します。 – 4386427
デバッガを使用してコードを実行し、関連するすべての変数を検査していますか? – alk