2011-09-23 52 views
8

Bir base64 bmp görüntüsünde (bu algoritmayı kullanarak http://devpro.it/code/216.html kullanarak) html5 branda verilerini System.Drawing.Image nesnesine dönüştüren bir sunucu işlemine gönderen bir sayfam var bunun üzerine bazı işlemler. benim yerel ortamdaSystem.ArgumentException: Parametre geçerli değil

, bu sadece çalışıyor, ama benim EC2 örneğinde aşağıdaki hatayı alıyorum: Burada

System.Drawing.Image image = null; 
string b64string = "..."; 
byte[] sf = Convert.FromBase64String(b64string); 
using (MemoryStream s = new MemoryStream(sf, 0, sf.Length)) 
{ 
    image = System.Drawing.Image.FromStream(s, false); 
} 
... 

içeren bir metin dosyası var şu şekildedir:

System.ArgumentException: Parameter is not valid. at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData) at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement)

Kodum görünüyor Test etmek için kullandığım bir örnek b64string: https://docs.google.com/leaf?id=0BzVLGmig1YZ3MTM0ODBiNjItNzk4Yi00MzI5LWI5ZWMtMzU1OThlNWEyMTU5&hl=en_US

Ayrıca aşağıdakileri denedim ve aynı sonuçları aldım:

System.Drawing.ImageConverter converter = new System.Drawing.ImageConverter(); 
image = converter.ConvertFrom(sf) as System.Drawing.Image;   

Herhangi bir fikir büyük takdir edilecektir!

+0

Bunu yerel olarak ve ec2 örneğinde hangi çerçeve sürümünü kullanıyorsunuz? – Oded

+0

Gerçek test verilerinin (bu dosya) ec2 örneğinde çözülemeyeceği, ancak dev makinenizde bulunabileceği anlamına mı geliyor? Örneğin. devrenizde ve sunucu testinizde farklı verilerin işlenmesi olasılığı yoktur. –

+0

Üzgünüm, her ikisinde de .NET 4.0 bahsetmeyi unutmuşum. – ari

cevap

5

Sorununuzun gerçek nedenini hala bilmiyorum, ancak sanırım bu, Image sınıfının tanımadığı bir görüntü biçimiyle ilgilidir. İkili verileri biraz inceledikten sonra, resminizi oluşturabilirim. Umarım bu yardımcı olur.

Bitmap GetBitmap(byte[] buf) 
{ 
    Int16 width = BitConverter.ToInt16(buf, 18); 
    Int16 height = BitConverter.ToInt16(buf, 22); 

    Bitmap bitmap = new Bitmap(width, height); 

    int imageSize = width * height * 4; 
    int headerSize = BitConverter.ToInt16(buf, 10); 

    System.Diagnostics.Debug.Assert(imageSize == buf.Length - headerSize); 

    int offset = headerSize; 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      bitmap.SetPixel(x, height - y - 1, Color.FromArgb(buf[offset + 3], buf[offset], buf[offset + 1], buf[offset + 2])); 
      offset += 4; 
     } 
    } 
    return bitmap; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (FileStream f = File.OpenRead("base64.txt")) 
    { 
     byte[] buf = Convert.FromBase64String(new StreamReader(f).ReadToEnd()); 

     Bitmap bmp = GetBitmap(buf); 
     this.ClientSize = new Size(bmp.Width, bmp.Height); 
     this.BackgroundImage = bmp; 
    } 
} 
+0

Teşekkürler! Bu bana daha iyi bir anlaşma yapar. Elde edilen çıktı renkleri değiştirir - R ve B değişti mi? Orijinal: http://i.imgur.com/a0UXf.gif Çıktı: http://i.imgur.com/TVUmk.gif (not: siyah arka plan, tuval veri dönüşümü nedeniyle olabilir) – ari

+0

Kod çözme kodu için bir kaynağınız var mı? – ari

+0

Kaynak? Hayır, ben yaptım. Orijinal görüntüyü bilmiyorum. Yani, SetPixel ile bu bitmap.SetPixel (x, height - y - 1, Color.FromArgb (buf [offset + 3], buf [offset + 2], buf [offset + 1]) gibi biraz oynamalısınız. , buf [offset])) Not: Buf [offset + 2] ve buf [offset] –

3

Gönderilen kod doğru görünüyor. Test ettim ve gayet iyi çalışıyor.

Özel durum "System.ArgumentException: Parametre geçerli değil." başka bir ipucu olmaksızın (özellikle parametrenin adı değil) GDI + (.NET Image sınıfının arkasındaki temel teknoloji) standardı olan InvalidParameter hatası için bir sarıcıdır, bu da tam olarak hangi parametrenin geçersiz olduğunu belirtmez.

Yani, .NET Reflector ile FromStream kodunu izleyerek, GDI + çağrılarında kullanılan parametrelerin aslında ... giriş akışı olduğunu görebiliriz.

Tahmin ettiğim, sağladığınız giriş akışı bazen bir görüntü olarak geçersizdir? Daha fazla araştırma için başarısız giriş akışlarını (örneğin, File.SaveAllBytes (sf) kullanarak) kaydetmelisiniz.

+0

'Yani tahmin ettiğim, sağladığınız girdi akışı bazen bir görüntü olarak geçersizdir? Örnek veriler hakkında ne düşünüyorsunuz? Resim sınıfı yüklenemedi ama sanırım bir şekilde doğru. –

+0

@ L.B - Örnek verileri (OP tarafından verilen bağlantı) başarıyla .BMP olarak yükleyebilirim. –

+0

Ama XP-Home'umla (32bit) yapamıyorum. Parametre geçerli değil ' –

0

Bu, sf geçersiz resim verisi içeriyorsa oluşabilir. Akışa geçirdiğiniz verilerin geçerliliğini doğrulayın ve sorunun giderilip giderilmediğini öğrenin.

İlgili konular