Stream2Bitmap & Reverse – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Stream2Bitmap & Reverse – .NET – Fórum – Programujte.comStream2Bitmap & Reverse – .NET – Fórum – Programujte.com

 

Mutagen0
Super člen
8. 6. 2014   #1
-
0
-

Zdravím, mám takový problem. Mám udělaný kod, kde ze souboru načtu stream a ten stream přes alg. převedu do bitmapy to mě funguje, ale jak udělat obráceně? Koumám nad tim přes pul dne a nic se mi nepodařilo vůbec vymyslet, tak jestli by jste mi poradili jak podle vzoru Stream2Bitmap udělat obráceně. Děkuji

	private static unsafe Bitmap LoadLand(Stream stream)
        {
            Bitmap bmp = new Bitmap(44, 44, PixelFormat.Format16bppArgb1555);
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, 44, 44), ImageLockMode.WriteOnly, PixelFormat.Format16bppArgb1555);
            BinaryReader bin = new BinaryReader(stream);

            int xOffset = 21;
            int xRun = 2;

            ushort* line = (ushort*)bd.Scan0;
            int delta = bd.Stride >> 1;

            for (int y = 0; y < 22; ++y, --xOffset, xRun += 2, line += delta)
            {
                ushort* cur = line + xOffset;
                ushort* end = cur + xRun;

                while (cur < end) *cur++ = (ushort)(bin.ReadUInt16() | 0x8000);
            }

            xOffset = 0;
            xRun = 44;

            for (int y = 0; y < 22; ++y, ++xOffset, xRun -= 2, line += delta)
            {
                ushort* cur = line + xOffset;
                ushort* end = cur + xRun;

                while (cur < end) *cur++ = (ushort)(bin.ReadUInt16() | 0x8000);
            }

            bmp.UnlockBits(bd);
            return bmp;
        }
Nahlásit jako SPAM
IP: 89.190.90.–
p3can
~ Anonymní uživatel
312 příspěvků
8. 6. 2014   #2
-
0
-

a proc ze tu bitmapu nenacitas pres new Bitmap(stream) ? analogicky k tomu je metoda Save(stream)

Nahlásit jako SPAM
IP: 77.92.213.–
Mutagen
~ Anonymní uživatel
549 příspěvků
9. 6. 2014   #3
-
0
-

Kvůli formátu. A potřebuju stejným formátem z bmp do streamu. Potřebuju zachovat formát.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 89.190.75.–
p3can
~ Anonymní uživatel
312 příspěvků
9. 6. 2014   #4
-
0
-

pokud potrebujes menit (omezene) nebo zachovat format pouzil bych

Bitmap b = new Bitmap("test.bmp");
            Bitmap b1 = new Bitmap(b);
            Bitmap b2 = b1.Clone(new Rectangle(0, 0, b.Width, b.Height), PixelFormat.Format16bppRgb555);
            b2.Save("new.bmp", ImageFormat.Bmp);

z neznameho duvodu je treba pouzit opravdu 3 bitmapy (1 pro nacteni ze souboru 2 pro preklopeni do nove a 3 na prevod formatu)

Nahlásit jako SPAM
IP: 77.92.213.–
Mutagen0
Super člen
9. 6. 2014   #5
-
0
-

#4 p3can
Asi jsi nepochopil, potřebuju bmp dostat do streamu podle toho formátu co jsem postnul, tohle mi z toho souboru vytáhne bmp a já potřebuju dostat stream podle formátu co tu je. Nepotřebuju BMP překonvertovat do BMP



Edit : Kdybych udělal jen tohle

Bitmap bmp = new Bitmap(stream);
return bmp;


tak mi to hodí error

An unhandled exception of type 'System.ArgumentException' occurred in System.Drawing.dll

Additional information: Parametr není platný.

řikám musí to bejt podle toho formátu, je to soubor kde je uloženo x bambilion textur a právě tohle je alg na jejich vytáhnutí

Nahlásit jako SPAM
IP: 89.190.90.–
p3can
~ Anonymní uživatel
312 příspěvků
9. 6. 2014   #6
-
0
-

a co

        public static Stream Bitmap2Stream(Bitmap b)
        {
            var d=b.LockBits(new Rectangle(0,0,20,30), ImageLockMode.ReadWrite, PixelFormat.Format16bppArgb1555);
            int size  = Math.Abs(d.Stride) * d.Height;
            byte[] values = new byte[size];

            System.Runtime.InteropServices.Marshal.Copy(d.Scan0, values, 0, size);
            b.UnlockBits(d);
            return new MemoryStream(values);
        }

        public static Bitmap Stream2Bitmap(Stream s)
        {
            var b = new Bitmap(20, 30, PixelFormat.Format16bppArgb1555);
            var d = b.LockBits(new Rectangle(0, 0, 20, 30), ImageLockMode.ReadWrite, PixelFormat.Format16bppArgb1555);
            int size = Math.Abs(d.Stride) * d.Height;

            var ms = new MemoryStream();
            s.CopyTo(ms);
            byte[] values = ms.ToArray();
            if (values.Length != size)
            {
                b.UnlockBits(d);
                throw new ArgumentException("invalid length","s");
            }

            System.Runtime.InteropServices.Marshal.Copy(values, 0, d.Scan0, size);
            b.UnlockBits(d);
            return b;
        }
Nahlásit jako SPAM
IP: 77.92.213.–
Mutagen0
Super člen
9. 6. 2014   #7
-
0
-

#6 p3can
To už vypadá zajímavě, jen to upravit podle toho předchozího a zjistit, zda to bude stejný jak při extrakci ze souboru a pak při importu do souboru

Nahlásit jako SPAM
IP: 89.190.90.–
p3can
~ Anonymní uživatel
312 příspěvků
9. 6. 2014   #8
-
0
-

a vt om tvem algoritmu delas vlastne presne co ? nechtelo se me to lustit protoze nemusim moc zapisy stylu
for (int y = 0; y < 22; ++y, ++xOffset, xRun -= 2, line += delta)

ja sem predpokladal ze v tom streamu jsou primo ty obrazove data ktere chces zobrazit v bitmape a to same pak ze potrebujes z bitmapy extrahovat pouze ty obrazove data do streamu (klasicka metoda Bitmap.Save prihazuje krome vlastnich obrazovych dat i hlavicky souboru).
 

Nahlásit jako SPAM
IP: 77.92.213.–
Mutagen0
Super člen
9. 6. 2014   #9
-
0
-

#8 p3can
Hele ten zápis není přesně muj, taky z něho nejsem moc 2x chytrej, ale jde o to, že to má jakoby čvercový tvar ala 45° šikmo tkže se to zapisuje takhle

Připojen obrázek.

A ne právě, že není to jen stream kterej bych uložil jen jako bmp to by bylo lehké to bych se tu ani neptal :)

Nahlásit jako SPAM
IP: 89.190.90.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý