[英]Xamarin - Convert image to byte array
I use a media plugin to take or pick a photo from either an Android device or iOS device.我使用媒体插件从 Android 设备或 iOS 设备拍摄或挑选照片。 I then want to tweet that image using LINQtoTwitter.然后我想使用 LINQtoTwitter 发布该图像。 In order to do that the image needs to be in the format bytes[].为此,图像需要采用 bytes[] 格式。 How would I convert my image to bytes in order to upload?我如何将我的图像转换为字节以便上传?
Code for getting Image获取图片的代码
takePhoto.Clicked += async (sender, args) =>
{
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
await DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
Directory = "Sample",
Name = "test.jpg"
});
if (file == null)
return;
await DisplayAlert("File Location", file.Path, "OK");
temp2 = file.Path;
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
};
pickPhoto.Clicked += async (sender, args) =>
{
if (!CrossMedia.Current.IsPickPhotoSupported)
{
await DisplayAlert("Photos Not Supported", ":( Permission not granted to photos.", "OK");
return;
}
var file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
{
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium
});
if (file == null)
return;
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
return stream;
});
};
Code for tweeting image推特图片代码
static async void SendTweetWithSinglePicture()
{
var auth = new SingleUserAuthorizer
{
CredentialStore = new SingleUserInMemoryCredentialStore
{
ConsumerKey = "KEY",
ConsumerSecret = "KEY",
AccessToken = "KEY",
AccessTokenSecret = "KEY"
}
};
var context = new TwitterContext(auth);
var uploadedMedia = await context.UploadMediaAsync(IMAGE);
var mediaIds = new List<ulong> { uploadedMedia.MediaID };
await context.TweetAsync(
"This is a test tweet",
mediaIds
);
}
Any help would be much appreciated任何帮助将非常感激
FOUND SOLUTION找到解决方案
takePhoto.Clicked += async (sender, args) =>
{
if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
await DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
return;
}
var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
{
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
Directory = "Sample",
Name = "test.jpg"
});
if (file == null)
return;
await DisplayAlert("File Location", file.Path, "OK");
temp2 = file.Path;
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
using (var memoryStream = new MemoryStream())
{
file.GetStream().CopyTo(memoryStream);
file.Dispose();
imageAsBytes = memoryStream.ToArray();
}
};
static async void SendTweetWithSinglePicture()
{
var auth = new SingleUserAuthorizer
{
CredentialStore = new SingleUserInMemoryCredentialStore
{
ConsumerKey = "KEY",
ConsumerSecret = "KEY",
AccessToken = "KEY",
AccessTokenSecret = "KEY"
}
};
var context = new TwitterContext(auth);
var uploadedMedia = await context.UploadMediaAsync(imageAsBytes, "image/jpg");
var mediaIds = new List<ulong> { uploadedMedia.MediaID };
await context.TweetAsync(
"Hello World! I am testing @dougvdotcom's #LinqToTwitter demo, at " +
"https://www.dougv.com/2015/08/posting-twitter-status-updates-tweets-with-linqtotwitter-and-net-part-3-media-tweets",
mediaIds
);
}
Image can not be converted to byte array , stream will be图像无法转换为字节数组,流将
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
file.Dispose();
byte[] imgByteArray = ConvertStreamToByteArray(imgStream);
return stream;
});
ConvertStreamToByteArray Method ConvertStreamToByteArray 方法
public byte[] ConvertStreamToByteArray (System.IO.Stream stream)
{
long originalPosition = 0;
if (stream.CanSeek)
{
originalPosition = stream.Position;
stream.Position = 0;
}
try
{
byte[] readBuffer = new byte[4096];
int totalBytesRead = 0;
int bytesRead;
while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
{
totalBytesRead += bytesRead;
if (totalBytesRead == readBuffer.Length)
{
int nextByte = stream.ReadByte();
if (nextByte != -1)
{
byte[] temp = new byte[readBuffer.Length * 2];
Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
readBuffer = temp;
totalBytesRead++;
}
}
}
byte[] buffer = readBuffer;
if (readBuffer.Length != totalBytesRead)
{
buffer = new byte[totalBytesRead];
Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
}
return buffer;
}
finally
{
if (stream.CanSeek)
{
stream.Position = originalPosition;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.