C# Forms:如何将图像从资源加载到字节数组中?
我有一个(希望是)简单的问题(我还没有找到答案,我所有的搜索都能找到) 我与Xamarin合作。表1.4.1-Pre-1。 在我的应用程序中,我有: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 };
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;
}
}