我正在寻找一个可以读写JPEG图像元数据的库.例如,如果我想嵌入并回读与jpeg图像相关的简短描述或故事,在图像文件本身中,您会推荐哪些开发库?
我对于什么语言(这是一个新项目)并不太感兴趣,尽管我已经为我熟悉的语言标记了这个问题(但我也会考虑其他语言).最好是相对跨平台的东西(mac/linux/win),比如Java,FreePascal/Lazarus,C++,Objective-C等(老实说我不熟悉跨平台,所以不知道是否是C#是一种可能性 - 除了Java或.NET等更受欢迎的产品之外,最好不要求安装任何特定的框架.
我真的很感兴趣 - 为什么你需要放
readln;
Run Code Online (Sandbox Code Playgroud)
从键盘读取一些值到变量后的行?例如,
repeat
writeln('Make your choise');
read(CH);
if (CH = '1') then begin
writeln('1');
end;
{ ... }
until CH = 'q';
Run Code Online (Sandbox Code Playgroud)
如果您运行以下代码,并在键盘上按"1",您会得到类似的输出
1
Make your choise
Make your choise
Make your choise
Run Code Online (Sandbox Code Playgroud)
另一方面,如果你添加"readln;" 这一切都很完美:
repeat
writeln('Make your choise');
read(CH);
readln;
if (CH = '1') then begin
Writeln('1');
end
until CH = 'q';
Run Code Online (Sandbox Code Playgroud)
我唯一的猜测是,不带参数调用readln会终止读取键盘输入的过程.但如果是这样,为什么读取/读取功能无法自行停止读取输入,以避免这种笨拙?
freepascal中是否有任何函数通过其代码显示Unicode符号(例如U + 1D15E)?不幸的是,Chr()只能使用ANSI符号(代码小于127).
我想使用自定义符号字体中的符号,将它们直接放入源代码非常不方便(它们在Lazarus中显示为?或其他东西,因为它们在系统字体中不存在).
我正在尝试从Delphi中的“近似最近邻居”(ANN)库访问各种功能(实际上,它是Lazarus / FreePascal,但这无关紧要)。
这是C ++中的减速度:
#include <cstdlib> // C standard lib defs
#include <ANN/ANNx.h> // all ANN includes
#include <ANN/ANNperf.h> // ANN performance
using namespace std; // make std:: accessible
....
....
void annMaxPtsVisit( // set limit on max. pts to visit in search
int maxPts) // the limit
{
ANNmaxPtsVisited = maxPts;
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试annMaxPtsVisit从Lazarus内部访问该函数的方法(如果您不知道Lazarus是什么,请假装其delphi):
unit unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm) …Run Code Online (Sandbox Code Playgroud) 我们在Turbo Pascal中有一个旧的应用程序可以将其内部状态保存到文件中,我们需要能够在C#应用程序中读/写该文件.
旧应用程序通过转储各种内存数据结构来生成文件.在一个地方,应用程序只转储一系列内存,而这个内存范围包含一些数组.我试图找出实际数组元素之前的字节的目的.特别是,块中的前两项可以表示为:
type
string2 = string[2];
stringarr2 = array[0..64] of string2;
string4 = string[4];
stringarr4 = array[0..64] of string4;
Run Code Online (Sandbox Code Playgroud)
在数据文件中,我看到以下字节序列:
25 00 02 02 41 42 02 43 44 ...
Run Code Online (Sandbox Code Playgroud)
这25是数组中元素的数量.这02 41 42是第一个字符串元素"AB"; 这02 43 44是第二个字符串元素,"CD",依此类推.我不知道00 02数组元素计数和第一个数组元素之间的含义是什么.数组元素的数量可能是25 00元素大小02,但每个数组元素的大小实际上是3个字节.
在文件中4字符字符串数组开始的位置,我看到以下内容:
25 00 04 00 00 04 41 42 43 44 04 45 46 47 48
Run Code Online (Sandbox Code Playgroud)
同样,25这是数组中元素的数量; 04 41 42 43 44是数组中的第一个元素,"ABCD",依此类推.在两者之间有字节00 04 00 00 …
我想将String转换为字节数组,代码如下所示:
procedure StringToByteArray(const s : String; var tmp: array of Byte);
var
i : integer;
begin
For i:=1 to Length(s) do
begin
tmp[i-1] := Ord(s[i]);
end;
end;
Run Code Online (Sandbox Code Playgroud)
s [i]这里是第i个String元素(= pos i处的char),我将其数值保存到tmp.
这适用于某些角色,但并非适用于所有角色,例如:
Ord('•')返回Dec(149),这是我所期望的.
但在我的程序中,Ord(s [i])返回相同角色的Dec(8226)!
Edit1:我认为缺陷在于我的其他功能"ByteArrayToStr"
转换时......
tmp:= 149 // tmp is of type byte
Log('experiment: ' + Chr(tmp)); // prints "•"
Log('experiment2 ' + IntToStr(Ord(Chr(tmp)))); // prints 149
Run Code Online (Sandbox Code Playgroud)
......来回,这似乎有效.
但是在以下函数中使用相同的转换将不会这样做:
function ByteArrayToStr( a : array of Byte ) : String;
var
S:String;
I:integer;
begin
S:='';
For I:=0 to …Run Code Online (Sandbox Code Playgroud) 对于Windows服务,我需要一个计时器来定期执行某项任务.当然,有许多选项似乎优于计时器(多线程,直接从服务的主线程调用方法),但它们在这种特定情况下都有它们的缺点.
但是,由于显而易见的原因,如果没有GUI的消息队列,SetTimer()将无法工作.我所做的(在Free Pascal中)是以下内容:
创建计时器:
MyTimerID := SetTimer(0, 0, 3333, @MyTimerProc);
Run Code Online (Sandbox Code Playgroud)
在服务的主循环中,运行计时器队列:
procedure TMyServiceThread.Execute;
var
AMessage: TMsg;
begin
repeat
// Some calls
if PeekMessage(AMessage, -1, WM_TIMER, WM_TIMER, PM_REMOVE) then begin
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
// Some more calls
TerminateEventObject.WaitFor(1000);
until Terminated;
end;
Run Code Online (Sandbox Code Playgroud)
最后,杀掉计时器:
KillTimer(0, MyTimerID)
Run Code Online (Sandbox Code Playgroud)
除了KillTimer总是返回False,这按预期工作.
我对你的反馈很感兴趣,但是,如果我的实现是正确的 - 我只是想避免弄乱其他应用程序的消息以及我不知道的其他副作用,因为我对消息处理经验不足.
谢谢!
我试图找出将使用Free Pascal case语句的示例传递给简单if语句的正确方法.
使用案例将是
begin usingCaseStatements;
var
user_age : Integer;
begin
Writeln('Please enter your age');
Readln(user_age);
case user_age of
1..12 : Writeln('You are too young');
else
Writeln('Invalid input');
end;
Writeln('Please any key to terminate the program');
Readln();
end.
Run Code Online (Sandbox Code Playgroud)
-----使用if语句--------
begin usingCaseStatements;
var
user_age : Integer;
begin
Writeln('Please enter your age');
Readln(user_age);
if user_age in 1..12 then
Writeln('You are too young')
else
Writeln('Invalid input');
Writeln('Please any key to continue');
Readln();
end.
Run Code Online (Sandbox Code Playgroud)
我已经尝试在if-statement snipet中替换"in"而没有任何运气在我试过的if (user_age = 1..12) then一点上它只给了我一个错误,编译器声明该语句正在等待')'但它发现..代替.我对FPC非常陌生,所以非常感谢帮助和提示.
这些功能很有用:
function MakeWord(low, high: char): word;
begin
result := byte(high) shl 8 + byte(low);
end;
function MakeWord(low, high: byte): word;
begin
result := high shl 8 + low;
end;
Run Code Online (Sandbox Code Playgroud)
但是我想知道这些类型的函数(可以以不同方式实现)是否已经存在于某个地方(不是在windows api特定文件中,而是在跨平台RTL函数中).
示例用例:取两个字符GT并从中生成WORD结果.
MakeWord('G','T');
Run Code Online (Sandbox Code Playgroud)
我发现这比在代码中插入SHL/SHR和/或十六进制操作以及其他黑客更容易读取,而这些操作并没有描述代码正在做什么......所以这些函数肯定存在于某个地方?或者人们在他们的应用程序中自行推出?
或类似的东西:
var x: word;
begin
lo(x) := byte('G');
hi(x) := byte('T');
end;
Run Code Online (Sandbox Code Playgroud)
但是,这不会起作用,因为左侧不能分配给:但它比其他一些解决方案IMO更具可读性.
我想我也看过LoWord和HiWord函数(或者LoByte,HiByte),但通常只读它们.怎么样写喜欢?
我在Lazarus中创建了一个基于TPaintBox的新组件.现在,在Object Inspector中,我拥有属于此基本组件(TPaintBox)的所有属性和事件.
我的问题是:我可以为我的组件隐藏选定的属性和事件吗?
例如,我想只显示Width和Height属性.
你能帮助我吗?
freepascal ×10
delphi ×6
lazarus ×3
pascal ×3
bit-shift ×1
c++ ×1
components ×1
cpu-word ×1
dll ×1
export ×1
inno-setup ×1
installer ×1
java ×1
jpeg ×1
metadata ×1
range ×1
timer ×1
turbo-pascal ×1
unicode ×1
winapi ×1