Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Forms:如何将图像从资源加载到字节数组中?_C#_Image_Xamarin_Xamarin.forms - Fatal编程技术网

C# Forms:如何将图像从资源加载到字节数组中?

C# Forms:如何将图像从资源加载到字节数组中?,c#,image,xamarin,xamarin.forms,C#,Image,Xamarin,Xamarin.forms,我有一个(希望是)简单的问题(我还没有找到答案,我所有的搜索都能找到) 我与Xamarin合作。表1.4.1-Pre-1。 在我的应用程序中,我有: byte[] AvatarErfassung; // Bytearray, to later update the webservice var Avatar = new Image { HeightRequest = 71, WidthRequest = 61, HorizontalOptions = LayoutOptions.Start };

我有一个(希望是)简单的问题(我还没有找到答案,我所有的搜索都能找到)

我与Xamarin合作。表1.4.1-Pre-1。 在我的应用程序中,我有:

byte[] AvatarErfassung; // Bytearray, to later update the webservice
var Avatar = new Image { HeightRequest = 71, WidthRequest = 61, HorizontalOptions = LayoutOptions.Start };
Avatar.Source = "SymbolMann.jpg";  
其中图像“SymbolMann.jpg”作为项目资源包含(在每个项目中),并显示在页面上(没有问题)。
现在,我想将图像放入字节数组中,以将其发送到我们的Web服务。 因此,我没有找到任何方法来访问图像“SymbolMann.jpg”(以字节数组加载),或者使用(然而)Avatar.Source

问题:
如何将图像“SymbolMann.jpg”放入字节数组“avatarerfasung”?

谢谢你的回答

嗨,迪米特里斯

感谢您的(快速)重播。
正如我所写,我与Xamarin一起工作。表单
图像存储为资源: 在\Resources\Drawable\(适用于Android)、\Resources\(适用于iOS)和根目录(适用于WP)中。 我必须在内容页上加载图像

如果我超过了你的代码,到那一行:

var assembly = this.GetType().GetTypeInfo().Assembly;
我收到了错误消息(翻译成英语):
“System.Type不包含GetTypeInfo方法的定义(是否缺少using?)”

我是否必须添加一个特定的using?

你写道: //您可以将“this.GetType()”替换为“typeof(MyType)”,其中MyType是程序集中的任何类型

我必须将什么作为类型放置?

=typeof(??).GetTypeInfo()程序集:

感谢您的进一步回复。

更新#2:

首先,谢谢你的耐心

不幸的是,在VS2013中,我没有找到任何函数“resolve”来显示缺少的用法-但我已经用我自己找到了缺少的用法:-)
同时,我补充说 运用系统反思

现在,该行: var assembly=this.GetType().GetTypeInfo().assembly

解析和编译时没有错误

此外,我还将.jpg的类型从“Android资源”更改为“嵌入式资源”。
然后,应用程序在以下行中崩溃: 长长度=s.长度; 因为s似乎是空的(我认为没有找到jpg)

进一步-如果我将类型更改为“Embedded Ressource”-则Xamarin.Forms(Avatar.Source=“SymbolMann.jpg”;)再也找不到该图像了。

如果我将.jpg的类型更改为“Compile”,则无法编译应用程序。
错误消息: 命名空间不能直接包含字段或方法等成员

那么…资源的正确类型是什么(以便可以使用assembly.GetManifestResourceStream()加载它?

我必须在文件名(SymbolMann.jpg)中添加一些内容才能找到它吗?

我如何更改Avatar.Source=“SymbolMann.jpg”以便找到它(如果我将类型从“Android资源”更改为任何其他内容)

再次强调我的需求:
在注册页面上,默认图像(符号)在标准的Xamarin.Forms图像(avatar.source=“SymbolMann.jpg”/“symbolfru.jpg”)中显示为男性和女性的化身。
.jpg存储在每个项目(Android、iOS和WP)的标准目录中,在这些项目中,图像对象可以毫无问题地访问 然后,用户可以获取一个默认图像,或通过mediapicker加载另一个图像。
如果用户点击“注册”按钮,我必须从图像创建一个字节数组,通过json将其发送到我们的Web服务。
如果用户通过mediapicker选择另一个图像,我将访问流,问题是,从默认图像变成字节数组(在每个平台中)


再次感谢您的帮助…

您可以通过读取程序集中的资源流轻松完成此操作:

var assembly = this.GetType().GetTypeInfo().Assembly; // you can replace "this.GetType()" with "typeof(MyType)", where MyType is any type in your assembly.
byte[] buffer;
using (Stream s = assembly.GetManifestResourceStream("SymbolMann.jpg”))
{
    long length = s.Length;
    buffer = new byte[length];
    s.Read(buffer, 0, (int)length);
}
// Do something with buffer
编辑:

要获取包含项目嵌入式资源的程序集,您需要对该程序集中包含的类型调用
GetTypeInfo
方法。因此,
typeof(X)
,其中“X”是程序集中的任何类型。例如,如果您正在使用名为
MyCustomPage
的自定义页面:

public class MyCustomPage : ContentPage {}
…这是您要传递的:
typeof(MyCustomPage)

您需要类型
type
的任何实例(这是
typeof
关键字基本返回的内容)。另一种方法是对项目中包含的任何对象调用
GetType()
方法

请注意,如果对项目中未包含的类型调用
typeof(X)
,将无法获得正确的程序集。例如,调用
typeof(ContentPage).GetTypeInfo().Assembly
,将返回
ContentPage
类型所在的程序集。该程序集不包含您的资源。我希望这不会造成混淆。如果是,请告诉我

现在,
GetTypeInfo
方法是包含在
System.Reflection
命名空间中的扩展方法。当Xamarin Studio中的文本编辑器无法识别某个内容时,它会以红色突出显示该内容。右击该方法将在上下文菜单中为您提供一个解析选项:

如果可以解析类型或方法,它将显示该选项


更多关于Xamarin形式的图片。

首先,非常感谢Dimitris,他引导我走向正确的方向!

结论:

基础:
我使用VS2013-更新2,Xamarin.Forms(1.4.1-Pre1),我的应用程序基于模板“空白应用程序(Xamarin.Forms共享)”(非PCL),我使用所有平台(Android、iOS、WP)

在用户注册页面上,用户可以选择一个图像作为头像(随后会显示在他的帖子中)-
//
string cNameSpace = "";
switch (Device.OS)
{
  case TargetPlatform.WinPhone:
    cNameSpace = "MatrixGuide.WinPhone";
    break;
  case TargetPlatform.iOS:
    cNameSpace = "MatrixGuide.iOS";
    break;
  case TargetPlatform.Android:
    cNameSpace = "MatrixGuide.Droid";
    break;
}
GV.cEmbeddedAblage = cNameSpace + ".Embedded.";
string cFilename = "";
if (GV.ByteSymbolMann == null) // not yet loaded
{
  cFilename = GV.cEmbeddedAblage + "SymbolMann.jpg";
  var assembly = this.GetType().GetTypeInfo().Assembly; 
  byte[] buffer;
  using (Stream s = assembly.GetManifestResourceStream(cFilename))
   {
     long length = s.Length;
     buffer = new byte[length];
     s.Read(buffer, 0, (int)length);
     GV.ByteSymbolMann = buffer; // Overtake byte-array in global variable for male
   }
}
//
if (GV.ByteSymbolFrau == null) // not yet loaded
{
  cFilename = GV.cEmbeddedAblage + "SymbolFrau.jpg";
  var assembly = this.GetType().GetTypeInfo().Assembly; 
  byte[] buffer;
  using (Stream s = assembly.GetManifestResourceStream(cFilename))
   {
     long length = s.Length;
     buffer = new byte[length];
     s.Read(buffer, 0, (int)length);
     GV.ByteSymbolFrau = buffer; // Overtake byte-array in global variable for female
    }
}
//Avatar.Source = "SymbolMann.jpg";  // Load from default directory
Avatar.Source = ImageSource.FromStream(() => new MemoryStream(GV.ByteSymbolMann)); // Load (stream) from byte-array
AvatarErfassung = GV.ByteSymbolMann;
Avatar.Source = ImageSource.FromStream(() => new MemoryStream(GV.ByteSymbolFrau)); 
AvatarErfassung = GV.ByteSymbolFrau;
public byte[] ImageDataFromResource(string r)
{
    // Ensure "this" is an object that is part of your implementation within your Xamarin forms project
    var assembly = this.GetType().GetTypeInfo().Assembly; 
    byte[] buffer = null;

    using (System.IO.Stream s = assembly.GetManifestResourceStream(r))
    {
        if (s != null)
        {
            long length = s.Length;
            buffer = new byte[length];
            s.Read(buffer, 0, (int)length);
        }
    }

    return buffer;
}
foreach(var data in names){Debug.WriteLine(data);}
Stream s = assembly.GetManifestResourceStream("resource_name_you_found.format")
using (var stream = await ImageService.Instance.LoadCompiledResource("resource_image.png").AsPNGStreamAsync())
{
    localBitmap = SKBitmap.Decode(stream);
}
public byte[] GetImageFromFile(string fileName)
{
    var applicationTypeInfo = Application.Current.GetType().GetTypeInfo();

    byte[] buffer;
    using (var stream = applicationTypeInfo.Assembly.GetManifestResourceStream($"{applicationTypeInfo.Namespace}.fileName"))
    {
        if (stream != null)
        {
            long length = stream.Length;
            buffer = new byte[length];
            stream.Read(buffer, 0, (int)length);
        }
    }

    return buffer;
}
public class MyPage() : ContentPage
{
    public MyPage()
    {
        var imageAsByteArray = GetImageFromFile("pizza.png");

        var pizzaImage = new Image();
        pizzaImage.Source = ImageSource.FromStream(() => new MemoryStream(imageAsByteArray));

        Content = pizzaImage;
    }

    byte[] GetImageFromFile(string fileName)
    {
         var applicationTypeInfo = Application.Current.GetType().GetTypeInfo();

        byte[] buffer;
        using (var stream = applicationTypeInfo.Assembly.GetManifestResourceStream($"{applicationTypeInfo.Namespace}.fileName"))
        {
            if (stream != null)
            {
                long length = stream.Length;
                buffer = new byte[length];
                stream.Read(buffer, 0, (int)length);
            }
        }

        return buffer;
    }
}