長い間何も書いていませんでしたが、これは以前の投稿で大量のトマトと卵に悩まされたからではなく、皆さんの参考になるように書き留めるべき本当のことが何もないからです。しかし、最近、友人のプロジェクトを手伝っていたときに、Delphi での簡単な画像処理のプロセスを見つけたので、インターネットで情報を探し続け、検索結果から過去の csdn の投稿を調べました。さまざまなプロジェクトで同様の画像処理の問題に遭遇したことがあるでしょうか。しかし、ほとんどの答えは不完全のようです (その多くは投稿されていないため、または個人的な習慣の問題である可能性があるためです。笑)、この記事を読んだ後はそう願っています。私の場合は、誰もが自宅で作業を始めることができます。そこで、参考のために私が遭遇した問題と解決策を以下に書きました。同時に、レンガを作り続けてください。
正式な内容の前に、解決したい問題を書き留め、また、私の下手な問題処理に読者がイライラしないように、読者に良い立場を与える必要があります。ここで解決すべき主な問題は、Delphi でスキャナでスキャンした画像を 90 度回転させて使用するのに適した画像にすることですが、画像の大きさが正確に把握できないため、単純に画像を拡大縮小する必要があります。私のソリューションは完全にこの要件に基づいています。画像処理後の効率や鮮明さについてはあまり考えておらず、プログラムが非常にシンプルに見えるという利点があります。
まず、私はスキャナを持っていないので、スキャナ(すでに提供されています)を使用して取得した画像がどのような形式であるか分かりません、そして、Delphiのヘルプには、「ビットマップは、作成するために使用される強力なグラフィックスオブジェクトです」と記載されています、操作 (拡大縮小、スクロール、回転、ペイント) を行い、画像をメモリ内に、またはディスク上のファイルとして保存します。」したがって、最初のステップは、処理のためにスライスを TBitmap に変換することです。形式を変換する際、後で画像の一部を選択するニーズに合わせて、画像の実際のサイズを変更しました。機能は次のとおりです。
プロシージャ TMainForm.ChangeImageFormate;
var ビットマップ : TBitmap;
ズーム: 整数;
始める
ビットマップ := TBitmap.Create;//1
試す
ImageCert で始めましょう
Bitmap.Assign(Picture.Graphic);//2
写真:= nil;//3
ズーム := Max(Bitmap.Width div 幅,Bitmap.Height div 高さ)+1;//4
幅 := Bitmap.Width div Zoom;//5
高さ := Bitmap.Height div Zoom;//6
Canvas.StretchDraw(Rect(0,0,Width,Height),Bitmap);//7
終わり;
ついに
ビットマップ。無料。
終わり;
終わり;
このコードはそれほど複雑ではないと思います。ImageCert は Form 上に配置された TImage コントロールです。唯一見慣れないのは 8 番目の文ですが、ここでは翻訳しません。 (私からのアドバイスは、ヘルプをもっと読むことです)。同時に、3 番目の文が非常に重要であることを指摘しておく必要があります。この文を削除し、画像形式が bmp でない場合、「ビットマップのみ変更できます」というエラーが表示されます。
2 番目のステップは画像の回転を実現することです。プログラムでは毎回 90 度回転するだけで済むため、ここでの処理は簡単です。処理方法はピクセル単位で置き換える方式です。実装プロセスは次のとおりです。
プロシージャ TMainForm.RotateImage;
var x,y : 整数;
TmpBitMap : TBitmap;
始める
TmpBitMap := TBitmap.Create;
試す
TmpBitMap.Assign(ImageCert.Picture.Graphic);
ImageCert で始めましょう
Picture.Bitmap.Height := TmpBitMap.Width;
Picture.Bitmap.Width := TmpBitMap.Height;
for x:=0 から高さまで
for y:=0 to width do
Canvas.Pixels[TmpBitMap.Height-x,y] := TmpBitMap.Canvas.Pixels[y,x];
高さ := TmpBitMap.Width;
幅 := TmpBitMap.高さ;
終わり;
ついに
TmpBitMap.Free;
終わり;
終わり;
このプログラムでは特に話すことはありませんが、高さと幅の設定がいくつかあるので、もっと何かする必要があるといつも感じていますが、行を削除することはできません。興味がある人は削除できます。試してみて、結果を教えていただければ一番良いです。この場合、TImage と TBitmap はそれぞれ独自のキャンバスを持っているので、どちらを使用するかは研究する価値があるかもしれませんが、時間の関係で試していません。
画像取得プロセスの一部として、私は TShape を使用し、ブラシ スタイルを bsclear に設定し、ImageCert の onMouseMove で TShape の位置を調整しました。これは、マウスが TShape 上にあるときは機能しないため、あまり敏感ではありません。影響はありますが、幸いなことに影響は小さいでしょう。同時に、TShape の OnMouseDown イベントで TShape の下にある写真をいくつか取り出しました。このとき、画像が拡大縮小されていない場合、削除された画像は表示されている位置と一致しないことがわかります (もちろん、TImage が画像サイズを正しく表示しない場合)。