0

ここに画像の説明を入力

ここに画像の説明を入力

添付された stringgrid に示されている対応するピクセル温度と Jpeg 画像を融合する方法はありますか。融合後、マウスを動かして画像から温度を読み取ります。もしあれば、誰か教えてください。

ありがとう、アマデューX

4

1 に答える 1

2

私が理解しているのは、手元に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
于 2013-01-24T00:28:32.033 に答える