2014-12-17 21 views
13

Ben araştırmalar yaptı ve bu çözüm üzerinde düştü: http://forums.xamarin.com/discussion/22682/is-there-a-way-to-turn-an-imagesource-into-a-byte-arrayImageSource'a byte [] için çapraz platform çözümü var mı?

İlk soru: http://forums.xamarin.com/discussion/29569/is-there-a-cross-platform-solution-to-imagesource-to-byte#latest

Biz HTTP Post aracılığıyla bir resim yüklemek istiyorum, burada denedik ne:

HttpClient httpClient = new HttpClient(); 
byte[] TargetImageByte = **TargetImageSource**; //How to convert it to a byte[]? 
HttpContent httpContent = new ByteArrayContent (TargetImageByte); 
httpClient.PostAsync ("https://api.magikweb.ca/debug/file.php", httpContent); 

Biz de vardır Kütüphaneler ile zor zaman geçirmemiz, kullanım maddelerine dahil olmalıyız. using System.IO; çalışır gibi görünüyor, ancak bize FileInfo veya FileStream gibi sınıflara erişim sağlamıyor.

Özel platform tabanlı dönüştürücülerden bunun nasıl yapılabileceği konusunda bir fikri olan var mı? Muhtemelen bir Xamarin.Forms.ImageSource işlevi toByte()?

Daha fazla bilgiye ihtiyacınız varsa bilin.

TargetImageSourceXamarin.Forms.ImageSource'dur.

ImageSource TargetImageSource = null;

Çözelti (Aşama doğru)

ImageSource mevcut başka bir tip köken vardır, önceki tip byte[] dönüştürülebilir. Bu durumda, bir resim çekmek için Xamarin.Forms.Labs kullanın ve FileStream özelliğine özelliği aracılığıyla erişilebildiği bir MediaFile döndürür.

//--Upload image 
//Initialization 
HttpClient httpClient = new HttpClient(); 
MultipartFormDataContent formContent = new MultipartFormDataContent(); 
//Convert the Stream into byte[] 
byte[] TargetImageByte = ReadFully(mediaFile.Source); 
HttpContent httpContent = new ByteArrayContent (TargetImageByte); 
formContent.Add (httpContent, "image", "image.jpg"); 
//Send it! 
await httpClient.PostAsync ("https://api.magikweb.ca/xxx.php", formContent); 

App.RootPage.NavigateTo (new ClaimHistoryPage()); 

fonksiyonu:

public static byte[] ReadFully(Stream input) 
{ 
    using (MemoryStream ms = new MemoryStream()){ 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
} 

cevap

8

Sana biraz geriye bakarak düşünüyorum.

ImageSource, bazı içeriği göstermek için Xamarin.Forms.Image için bir kaynak resim sağlamanın bir yoludur. Zaten ekranda bir şey gösteriyorsanız, Image görünümünüz, dosya veya kaynak gibi başka bir yerden gelen veya bellekte bir dizide saklanan verilerle doldurulmuş ... ya da ilk başta bunu aldınız. Bu verileri ImageSource'dan geri almaya çalışmak yerine, bir referansı saklayabilir ve gerektiğinde yükleyebilirsiniz.

Bu çözümün sizin durumunuz için geçerli olduğunu hissetmiyorsanız, özel gereksinimlerinizi biraz daha ayrıntılı bir şekilde açıklayabilirsiniz.

sözde kod:

ShowImage(){ 
    ImageSource imageSource = ImageSource.FromFile("image.png"); // read an image file 
    xf_Image.Source = imageSource; // show it in your UI 
} 

UploadImage(){ 
    byte[] data = File.ReadAll("image.png"); 
    // rather than 
    // byte[] data = SomeMagicalMethod(xf_Image.Source); 
    HttpClient.Post(url, data); 
} 

GÜNCELLEME: Eğer bir bellek akışı içine MediaFile.Source akışı kopyalayabilirsiniz bir resim alıyoruz yana

, o zaman hafıza akışının konumunu sıfırlayabilirsiniz Akışın başlangıcına işaret etmek için bir kez daha okuyabilir ve http gövdesine kopyalayabilirsiniz.

Alternatif olarak, bir dosyaya MediaFile.Source kodunu kaydedebilir ve ImageSource.FromFile'u UI'ye yüklemek için kullanabilirsiniz ve gerektiğinde, dosyanın içeriğini bir http post gövdesine kopyalayabilirsiniz.

+0

Doğru olduğuna inanıyorum! ImageSource sadece bir görünüm öğesidir. Resim çekildikten sonra görüntüyü anı olarak bir akış olarak alıyorum. 'TargetImageSource = ImageSource.FromStream (() => mediaFile.Source)' ' ' Stream' veya 'MediaFile'ı' byte [] 'a çevirip çözümünüzü güncelleyeceğim. –

+0

, küçük bir güncelleme ekledi, ama bence bu fikri zaten aldınız. –

+0

Bir güncelleme eklediniz, 'ImageSource' anlayışımı düzelttiniz. Tek eğlence alternatifi, “ImageSource” un, daha önce olduğu gibi geri alınabilmesiydi: “ImageSource.Stream” –

İlgili konular