Toon posts:

[C#] byte array eerste bytes overslaan.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Mensen,

Ik heb een webservice die een plaatje naar mij toestuurt als een byte array.
Ik heb een appicatie die deze plaatjes omzet naar afbeeldingen (bitmap) zover werkt dit. Maar nu is het geval dat bij deze afbeeldingen de eerste bytes gescrambled zijn (kapot gemaakt tegen diefstal, en dit doen wij zelf). Nu wil ik graag de eerste bytes overslaan om het origenele plaatje weer te krijgen. Het lukt me wel om eerste het plaatje te downloaden en dan met binairy read en write dit er af te halen. Maar aangezien deze plaatje een soort van preview zijn lijkt het me niet handig om alles eerst te downloaden en moet het dus on de fly gebeuren.

Hier is de functie die een byte array omzet naar een bitmap, de point bData.scan0 is het begin punt van de afbeelding uit het geheugen, maar hoe kan ik zeggen dat hij pas by byte .... moet beginnen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ### TEMP CODE, NEEDED FOR SCREENSHOT CREATION.
        private unsafe Bitmap BytesToBmp(byte[] bmpBytes)
        {
            // ### The new bitmap.
            Bitmap bmp = new Bitmap(cApplicationSettings.getThumbWidth(), cApplicationSettings.getThumbHeight());

            // ### Data.
            BitmapData bData = bmp.LockBits(new Rectangle(new Point(), bmp.Size), ImageLockMode.WriteOnly,PixelFormat.Format24bppRgb);

            // Copy the bytes to the bitmap object
            Marshal.Copy(bmpBytes, 0, , bmpBytes.Length);
            bmp.UnlockBits(bData);

            // ### Return a bitmap.
            return bmp;
        }

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:53
Je gebruikt de Marshal.Copy method. Heb je wel al eens naar de overloads en de verschillende argumenten van die method gekeken ?
Er zit nl. een argument startIndex bij....

https://fgheysels.github.io/


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:20
Ik voel aan mijn water dat je bij Marshal.Copy ff op F1 moet drukken

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:53
Ik vraag me trouwens af waarom je het op deze manier doet ?
Een Bitmap heeft ook een constructor die een Stream object als argument neemt, en een MemoryStream kan je dan weer maken adhv een byte array, en een MemoryStream constructor heeft ook een overload waarmee je een startindex kan opgeven.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ohke..dat wist ik niet, ik ga direct kijken naar die MemoryStream methode. Bedankt.

Hmm..ik heb geprobeerd wat jullie zeiden met die memorystream maar ik krijg de hele tijd een fout melding van een ongeldige parameter.

Dit is mijn code.
code:
1
2
3
4
5
// ### Set background.
                byte[] b = (byte[])asItem.thumbnail;
                MemoryStream strmMem = new MemoryStream();
                this.pnlItem.BackgroundImage = new Bitmap(strmMem);
                strmMem = null;


Dit is de voorbeeld code die ik gebruikt heb.
code:
1
2
3
4
5
6
7
8
9
// get image
 DataRowView drv = (DataRowView) _cm.Current;
 byte[] content = (byte[])drv["stream"];
 MemoryStream stream = new MemoryStream(content);
 Bitmap image = new Bitmap(stream);
 
 ShowImageForm f = new ShowImageForm();
 f._viewer.Image = image;
 f.ShowDialog(this);

[ Voor 83% gewijzigd door Verwijderd op 14-06-2006 14:17 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-02 23:22

Janoz

Moderator Devschuur®

!litemod

Heb je ook al op F1 gedrukt bij Marshal.Copy, zoals Farlane aangaf?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:53
Marshal.Copy heeft ook een startIndex argument zoals ik al eerder aangaf.

Enneh, een fout ? Welke fout precies ? En wat doe je in je code-voorbeeld nu met je byte array ? Die gebruik je nergens ?
En van welk type is asItem.Thumbnail ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
dat van die byte array was een tik fout zag, daar moest natuurlijk new MemoryStream(b); staan.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:53
Ja, maar asItem.Thumbnail zal wel geen byte array zijn, of van een type die je zomaar naar byte[] kunt casten.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Jewel dit is een webservice en ik krijg een byte[] terug. Als ik met mijn muis over de definitie ga staat er byte[] asset.thumbnail
Pagina: 1