小编tho*_*asb的帖子

将元数据写入jpg和png

我需要为上传的图像添加元数据标签(描述).

我找到了这个答案:https://stackoverflow.com/a/1764913/6776适用于JPG文件,但不适用于PNG.

private string Tag = "test meta data";

private static Stream TagImage(Stream input, string type)
{
    bool isJpg = type.EndsWith("jpg", StringComparison.InvariantCultureIgnoreCase) || type.EndsWith("jpeg", StringComparison.InvariantCultureIgnoreCase);
    bool isPng = type.EndsWith("png", StringComparison.InvariantCultureIgnoreCase);

    BitmapDecoder decoder = null;

    if (isJpg)
    {
        decoder = new JpegBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    }
    else if (isPng)
    {
        decoder = new PngBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    }
    else
    {
        return input;
    }

    // modify the metadata
    BitmapFrame bitmapFrame = decoder.Frames[0];
    BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
    metaData.Subject = Tag;
    metaData.Comment …
Run Code Online (Sandbox Code Playgroud)

c# image

6
推荐指数
1
解决办法
7361
查看次数

为什么在PowerShell中:for($ i = 0; -le $ total-1; $ i ++)而不是for($ i = 0; -lt $ total; $ i ++)

我正在查看powershellpro.com上的一些代码示例,并且不明白他为什么编写通过以下方式循环遍历数组的示例代码:

...增量从零开始然后增加1,直到它小于或等于数组的长度减去1 ...

for ($i=0; $i -le $total-1; $i++)
Run Code Online (Sandbox Code Playgroud)

...而不是让增量从零开始然后再增加1直到它小于数组的长度......

for ($i=0; $i -lt $total; $i++)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?它们在功能上是等效的,并且将循环遍历数组中的每个项目.我个人认为第二个版本更清洁.是否有最好的做法或者说你应该使用第一个?

powershell

5
推荐指数
1
解决办法
4万
查看次数

如何在.net中并行启动多个操作?

我有一个运行时间太长的应用程序,我想引入线程/并行化/无论如何.

具体来说,代码会检索几千封邮件,然后发送它们.今天,代码看起来像这样(有点简化):

Dim mails = centreInteretService.GetEmails()
For Each m in mails
    m.Body = GetMailContent(m)
    If MailSendable(m) Then
        SendMail(m)
    End If
Next
Run Code Online (Sandbox Code Playgroud)

我想尝试并行发送多封邮件.我想尝试并行使用2个线程.更具体地说,我想将整个循环放在一个线程中(getmailcontent + sendmail).

我想到了这样的事情:

Dim mails1 As New List(Of MailSerialiserCI)
Dim mails2 As New List(Of MailSerialiserCI)
Dim nbFirstList As Integer = CInt(Math.Ceiling(nbTotal / 2))
mails1 = mails.Take(nbFirstList)
mails2 = mails.Skip(nbFirstList)

Dim smt1 As New MailSender.MailSenderThreaded()
smt1.mails = mails1
smt1.nbTotal = nbTotal
Dim threadMails1 As ThreadStart = New ThreadStart(AddressOf smt1.SendMails)
Dim th1 As Thread = New Thread(AddressOf threadMails1)
th1.Start()

Dim …
Run Code Online (Sandbox Code Playgroud)

.net multithreading .net-3.5

5
推荐指数
1
解决办法
100
查看次数

不要在RestSharp中编码参数

我正在使用RestSharp来访问RubyOnRails API.您可能知道,当参数名称在表单中时,RoR喜欢model_name[property].另一方面,RestSharp不喜欢它.

Fiddler说我把它发送到服务器:

user%5Bemail%5D=user%40email.com&user%5Bpassword%5D=test
Run Code Online (Sandbox Code Playgroud)

看起来R#在发送数据时对参数和值进行编码(与Curl不同,它看起来像是有选择地编码).虽然在大多数情况下我认为这很好,但在这种特殊情况下,它会使API返回401,因为它不了解参数.

是否可以要求R#不对请求的参数进行编码?

谢谢 !

编辑

好的,在R#源代码中,我找到了方法RestClient.EncodeParameters,所以看起来参数的名称总是被编码.我想我将不得不叉它:(

restsharp

5
推荐指数
3
解决办法
5839
查看次数

XPS 编写器因 .Net 4/字体渲染错误而失败?

我们有一个 WPF 应用程序,它允许用户按照自己的意愿输入和设置文本样式。然后将它们的文本转换为 XPS 以使用 ABCPdf 插入到 PDF 中。

我们最近切换到 .Net 4,现在 XPS 生成有时会生成格式错误的 XPS。

生成格式错误的 XPS 的唯一时间是当用户使用重叠两个字符的字体时(例如 Sevillana,可在 Google Fonts 上找到)。在 .Net 4 中,字符重叠,而在 .Net 3.5 中,它们不重叠。从另一个 SO 问题中,我认为这是因为 .Net 4.0 已更改其字体渲染引擎。

.Net 3.5:
点网 3.5

.Net 4.0 :(注意“d”和“A”是如何重叠的)
点网 4.0

看起来 .Net 4 没有考虑撇号的间距,甚至否定它。如果我删除撇号,间距会变宽。我创建了一个简单的测试项目来演示这个问题:https : //github.com/tbroust-trepia/wpf-4-font-rendering

我们将 FlowDocument 保存到 XPS 的方法与从 FlowDocument 创建 XPS 文档并即时附加它的方法几乎相同(我怀疑原始开发人员只是复制/粘贴了该代码);它只是将 XPS 保存到文件而不是流中。

MS 工具 IsXPS表示特定节点无效。事实上,在 Documents\1\Pages\1.fpage 中,Indices 的值为;,-16;,84;;;;,30。我可以看到“0.-16”并不是一个真正的数字。

所以,我有很多问题:

  • 为什么会这样?我不明白这些值是如何转换成这些索引的。我猜转换引擎试图将其设置为“-0.16”但搞砸了?
  • 我可以在保存之前修改/检查此索引的值吗?
  • 如果我不能,我怎样才能事后检查?我在这里找到了一种XPS 验证器,但我不明白如何从那里检查索引值。我可以手动完成,读取和解析 XML,但我确信这不是一个好主意。

编辑 …

.net c# wpf xps

5
推荐指数
1
解决办法
551
查看次数

将一种数据转换为另一种数据的设计模式

我必须调用一个传统的SOAP Web服务,它从一个发送JSON中描述的数据的干净(呃)REST Web服务发送一个原始DataSet.

我需要将列出我的对象的原始数据集转换为真正的对象列表.

我得到的数据集没有足够的信息,因此转换不是"简单".它涉及从每个对象的DB中获取附加数据.

这样做的最佳设计模式是什么?我的第一个天真的反射是创建一个方法,将这个数据集作为参数,解析它,并返回一个对象列表,但我觉得必须有一个更好的方法来做到这一点.

我已经看到了适配器模式,但我理解它"仅"将现有类转换为"看起来像它"的另一个类.我想完全将数据从类似于带有id和name的字符串表的内容更改为包含每个有用信息的真实实例集合.

更新

我还有另一个类似的问题.我们有一个旧的桌面应用程序和一个新的在线应用程序,它们以不同的方式执行相同的操作.但是,这两个应用程序的保存文件非常不同.
我想在这些格式之间创建一个转换器.正如@ VS1所建议的Mapper模式看起来很有希望进行此操作,但我认为我不能像AutoMapper那样使用简单直接的东西.适配器模式也可能有所帮助.我会研究这些.

design-patterns

5
推荐指数
1
解决办法
1万
查看次数

MahApps.Metro图标没有显示

我正在尝试使用MahApps.Metro 0.13.1.0在窗口标题栏中添加"刷新"按钮.

我的App.xaml是这样的:

<Application x:Class="VersionSwitcher.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Views/MainWindow.xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             d1p1:Ignorable="d"
             xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
                <ResourceDictionary Source="/Resources/Icons.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:VersionSwitcher.ViewModel" />
        </ResourceDictionary>
    </Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)

然后在我的MainWindow.xaml中:

<Controls:MetroWindow.WindowCommands>
    <Controls:WindowCommands>
        <Button ToolTip="{x:Static p:Resources.Button_Refresh}"
                Style="{DynamicResource MetroCircleButtonStyle}" Width="30" Height="30">
                <Rectangle Fill="Black">
                    <Rectangle.OpacityMask>
                        <VisualBrush Stretch="Fill"
                                     Visual="{DynamicResource appbar_refresh}" />
                    </Rectangle.OpacityMask>
                </Rectangle>
        </Button>
    </Controls:WindowCommands>
</Controls:MetroWindow.WindowCommands>
Run Code Online (Sandbox Code Playgroud)

我在标题栏中有一个灰色圆圈,但没有图标!任何图标(来自Resources/Icons.xaml)都做同样的事情.

如果图标放在窗口内容而不是标题栏中,它会做同样的事情.

我错过了什么?

谢谢 !

更新

我发现为Rectangle设置宽度和高度会显示图标.如何随时填充按钮我该怎么办?

wpf mahapps.metro

5
推荐指数
1
解决办法
8575
查看次数

Swig - 生成包装器以传递结构数组

更新

我刚刚发现了有关该%apply指令的信息(例如,请参见此处)。不幸的是,我不能让它与结构一起工作:

%module packer_cs
%include "carrays.i"
%{
    #include "packer.h" 
%}
%include "typemaps.i"
%include "arrays_csharp.i"
%apply image_t INPUT[] { image_t *images }
%include "packer.h"
Run Code Online (Sandbox Code Playgroud)

这导致:

swig -csharp -outdir bin\csharp packer\packer.i
Warning 453: Can't apply (image_t INPUT[]). No typemaps are defined.
Run Code Online (Sandbox Code Playgroud)

我找不到有关此警告的任何文档。看起来我必须定义一个自定义类型映射,但我不知道从哪里开始。我对文档的缺乏越来越厌倦,并且非常渴望有一天能够成功地编写我的包装器:(

原帖

按照我之前的两篇 文章,我在 C# 中使用 C 库仍然有问题。

回顾一下:我有一个 C 库,我正在尝试使用 Swig 编写一个 C# 包装器。

在 .h 文件中,该方法声明如下:

int pack(image_t *images, int nb_images, parameters_t params);
Run Code Online (Sandbox Code Playgroud)

实际上*images总是传递一个数组。如果我只是像这样生成 swig 文件,在 C# 文件中,该函数需要一个实例:

  public static int …
Run Code Online (Sandbox Code Playgroud)

c c# swig

5
推荐指数
1
解决办法
2007
查看次数

属性或索引器必须至少有一个访问器

我正在学习 C#,目前正在尝试掌握访问器。
看着这个我快疯了,我不知道我做错了什么:

class BankAccount
{
    // *PROPERTIES* 
    private int _initialDeposit = 0;

    // **ACCESSORS** 
    public int SavingsAccount
    {
        set
        {
            _initialDeposit = value;
        }
        get
        {
            return _initialDeposit;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

表格如下所示:

public partial class BankForm : Form
{
    private BankAccount _myAccount;

    public BankForm()
    {
        InitializeComponent();
        _myAccount = new BankAccount();
    }

    private void initialDepositButton_Click(object sender, EventArgs e)
    {
        _myAccount.SavingsAccount = Convert.ToInt32(initialDepositTextBox.Text);
        bankAccountListBox.Text = "Account opened with initial Deposit " + initialDepositTextBox.Text;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

属性或索引器必须至少有一个访问器

c#

5
推荐指数
1
解决办法
3万
查看次数

仅为一种方法重定向控制台输出

我这里有一堆单元测试.其中一个人希望代码什么也不做,因为参数解析不起作用.

不幸的是,解析库的参数我Console.Write()在这种情况下使用了强制,现在我的单元测试输出充满了库的消息,这使得它很难阅读.

有没有办法在调用此方法之前将标准控制台输出重定向到空(或临时文件或其他),然后在完成后将其重定向回标准输出?

谢谢!

更新

实际上这是需要重定向的错误输出...

c# console output

4
推荐指数
2
解决办法
3250
查看次数