添付された stringgrid に示されている対応するピクセル温度と Jpeg 画像を融合する方法はありますか。融合後、マウスを動かして画像から温度を読み取ります。もしあれば、誰か教えてください。
ありがとう、アマデューX
添付された stringgrid に示されている対応するピクセル温度と Jpeg 画像を融合する方法はありますか。融合後、マウスを動かして画像から温度を読み取ります。もしあれば、誰か教えてください。
ありがとう、アマデューX
私が理解しているのは、手元に3つの異なる質問があるということです。答えとともに、以下にそれらを指摘します。ただし、これらのタイプのプロジェクトを自分で実行するために最善を尽くす必要があります。解決する必要のある特定の問題がある場合にのみ、ここで質問してください。「何かをする方法」を尋ねることは常に主観的です。
質問2と3はどちらか、または解決策です。つまり、それぞれが異なる質問になり、完全に別々に答えることができます。しかし、どちらも最初の質問に依存しています。
質問1:「マウスが上を向いているピクセルの色を特定するにはどうすればよいですか?」
TImage
デフォルトのプロパティを持つ標準のコントロールを使用していて、画像のサイズ変更、拡大、中央揃えが設定されていないことを前提としています。それを行う必要がある場合は、別のアプローチがあります。
まず、マウスが上を向いているピクセルを特定する必要があります。これを行うにはいくつかの方法がありますが、画像を表示するために使用しているコントロールに応じて(標準を想定していますTImage
)、Mouse Moveイベント(OnMouseMove
)を使用して、このコントロール上でのマウスの動きをキャプチャすることをお勧めします。この時点で、現在のマウスの位置を特定する必要があります。ありがたいことに、このイベントには、マウスポインタのX位置とY位置が含まれています。
次に、画像のキャンバスを取得する必要があります。これは次の方法で取得できます。
TImage.Picture.Bitmap.Canvas
次に、CanvasのPixels[]
プロパティを読み取って色を取得します。
質問2:「色がFrom / Toスケールのどこにあるかを特定するにはどうすればよいですか?」
マウスがどの色を指しているかがわかったので、この色がスケールのどの位置にあるかを特定する必要があります。このため、1つのカラーチャンネルだけに固執するのが最も簡単です。上記の例は、さまざまな色の組み合わせとフェードを示しています。これは、説明するのが難しい方法です。これは私にはできない独自の考えが必要なので、追加の質問として質問してください(私が得意ではない広範な数学が必要です)。
質問3:「画像をデータのテーブルにリンクするにはどうすればよいですか?」
温度測定値の表があるので、上記の最初の質問で提供された個々のピクセルに基づいて、この表を列/行ごとに読み取る必要があります。
マウスのX/Y位置はすでにわかっているので、これらの同じ変数を使用してグリッドの列/行を識別します。(このデータを格納する主要なベースとしてグリッドを使用することはお勧めしません。代わりにクライアントデータセットを使用し、そのデータをグリッドに動的にロードする必要があります。)
結論:
これが私があなたのために用意したサンプルアプリのコードです。それはあなたがしていることの背後にある基本を理解するのに役立つはずです。この回答のコードを生の画像データで汚染したくなかったので、自分の画像を選択する必要があります。
注:画像がデータにどのようにリンクされるかを明確にするために質問を編集したら、回答を変更します。そうでなければ、これは私が現在の状態で説明できる最高のものです。
Unit1.pas
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Shape1: TShape;
StatusBar1: TStatusBar;
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
Color: TColor;
Canvas: TCanvas;
R, G, B: Byte;
begin
Canvas:= Image1.Picture.Bitmap.Canvas;
Color:= Canvas.Pixels[X, Y];
Shape1.Brush.Color:= Color;
R:= GetRValue(Color);
G:= GetGValue(Color);
B:= GetBValue(Color);
StatusBar1.Panels[0].Text:= 'Pos: '+IntToStr(X)+' x '+IntToStr(Y);
StatusBar1.Panels[1].Text:= 'Clr: '+IntToStr(Color);
StatusBar1.Panels[2].Text:= 'RGB: '+IntToStr(R)+' x '+IntToStr(G)+' x '+IntToStr(B);
end;
end.
Unit1.dfm
object Form1: TForm1
Left = 315
Top = 113
Caption = 'Form1'
ClientHeight = 415
ClientWidth = 548
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
DesignSize = (
548
415)
PixelsPerInch = 96
TextHeight = 13
object Image1: TImage
Left = 0
Top = 0
Width = 548
Height = 281
Align = alTop
Anchors = [akLeft, akTop, akRight, akBottom]
OnClick = Image1Click
OnMouseMove = Image1MouseMove
end
object Label1: TLabel
Left = 8
Top = 285
Width = 31
Height = 13
Anchors = [akLeft, akBottom]
Caption = 'Label1'
end
object Shape1: TShape
Left = 8
Top = 312
Width = 532
Height = 57
Anchors = [akLeft, akRight, akBottom]
end
object StatusBar1: TStatusBar
Left = 0
Top = 396
Width = 548
Height = 19
Panels = <
item
Width = 150
end
item
Width = 150
end
item
Width = 50
end>
end
end