0

在此处输入图像描述

在此处输入图像描述

有没有办法将 Jpeg 图像与附加的字符串网格中显示的相应像素温度融合。融合后,鼠标围绕并读取图像中的温度。如果有,请任何人告诉我如何。

谢谢你,AmmadeuX

4

1 回答 1

2

我的理解是你手头有三个不同的问题。我将在下面指出它们,并附上答案。但是请您,您需要尽最大努力自己完成这些类型的项目,并且只有在您有需要解决的特定问题时才在这里提问。问“如何做某事”总是主观的。

问题 2 和 3 是非此即彼的解决方案,这意味着每个问题都可以是一个不同的问题,并且可以完全独立地回答。但他们都仍然依赖于第一个问题。

问题1:“如何识别鼠标指向的像素的颜色?”

我假设您使用的是TImage具有默认属性的标准控件,并且未设置为重新调整大小、拉伸或居中图像。如果你需要这样做,有一种不同的方法。

首先,您必须确定鼠标指向的像素。有几种方法可以做到这一点,但取决于您用于显示图像的控件(我假设是标准的TImage),我建议使用鼠标移动事件 ( OnMouseMove) 来捕获鼠标在此控件上的移动。此时,您需要识别当前鼠标位置。值得庆幸的是,此事件带有鼠标指针的 X 和 Y 位置。

然后,您需要获取图像的画布。您可以通过以下方式获得:

TImage.Picture.Bitmap.Canvas

接下来,读取 Canvas 的Pixels[]属性以获取颜色。

问题 2:“我如何确定颜色落在 From/To 刻度上的哪个位置?”

现在您知道鼠标指向的是什么颜色,您需要确定该颜色属于刻度的哪个位置。为此,最简单的方法是只使用 1 个颜色通道。你上面的例子说明了不同颜色的组合和褪色,这对我来说太棘手了,无法解释。请将此作为一个附加问题提出,因为它需要我自己做不到的想法(需要我不擅长的大量数学)。

问题 3:“如何将图像链接到数据表?”

由于您有一个温度读数表,因此您需要根据上面第一个问题中提供的单个像素按列/行读取此表。

由于您已经知道鼠标的 X/Y 位置,因此使用这些相同的变量来识别网格的列/行。(我不鼓励使用网格作为存储此数据的主要基础,您应该使用客户端数据集,并使用该数据动态加载网格。)

结论:

这是我为您准备的示例应用程序的代码。它应该可以帮助您了解您正在做的事情背后的基础知识。您必须选择自己的图像,因为我不想用原始图像数据污染这个答案的代码。

注意:一旦您编辑问题以明确您希望图像如何链接到数据,那么我将修改我的答案。否则,这是我在当前状态下能解释的最好的。

单元1.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.

单元1.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 回答