Img ze streamu a Img do streamu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Img ze streamu a Img do streamu – .NET – Fórum – Programujte.comImg ze streamu a Img do streamu – .NET – Fórum – Programujte.com

 

Mutagen0
Super člen
17. 6. 2013   #1
-
0
-

Zdravím,

píšu si jednu takovou appku na úpravu grafiky, našel jsem si i nějaký ty kódy co mi dokážou pracovat se souborama, ale jaksi jsem se zasekl na jednom zasadním problemu. Sice ten kod mi tu grafiku najde a vykresli do Bitmapy, ale když tu samou grafiku vezmu z .BMP souboru, tak ten stream je jinej, nebo aspon ty hodnoty co čtu jsou jiný.

Tohle je asi nejdůležitější (index = číslo grafiky)

public Stream Seek(int index, out int length, out int extra, out bool patched)
        {
            if (index < 0 || index >= m_Index.Length)
            {
                length = extra = 0;
                patched = false;
                return null;
            }

            Entry3D e = m_Index[index];

            if (e.lookup < 0)
            {
                length = extra = 0;
                patched = false;
                return null;
            }

            length = e.length & 0x7FFFFFFF;
            extra = e.extra;

            if ((e.length & (1 << 31)) != 0)
            {
                patched = true;

                //Verdata.Stream.Seek(e.lookup, SeekOrigin.Begin);
                //return Verdata.Stream;
            }

            if (m_Stream == null)
            {
                length = extra = 0;
                patched = false;
                return null;
            }

            patched = false;

            InvalidateFileStream();

            m_Stream.Seek(e.lookup, SeekOrigin.Begin);
            return m_Stream;
        }

Použije se dál toto
 

Stream stream = m_FileIndex.Seek(index, out length, out extra, out patched);

A na řadě je tohle

private static unsafe Bitmap LoadStatic(Stream stream)
        {
            BinaryReader bin = new BinaryReader(stream);

            int unk = bin.ReadInt32();
            int width = bin.ReadInt16();
            int height = bin.ReadInt16();

            if (width <= 0 || height <= 0)
                return null;

            int[] lookups = new int[height];

            int start = (int)bin.BaseStream.Position + (height * 2);

            for (int i = 0; i < height; ++i)
                lookups[i] = (int)(start + (bin.ReadUInt16() * 2));

            Bitmap bmp = new Bitmap(width, height, PixelFormat.Format16bppArgb1555);
            BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format16bppArgb1555);

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

            for (int y = 0; y < height; ++y, line += delta)
            {
                bin.BaseStream.Seek(lookups[y], SeekOrigin.Begin);

                ushort* cur = line;
                ushort* end;

                int xOffset, xRun;

                while (((xOffset = bin.ReadUInt16()) + (xRun = bin.ReadUInt16())) != 0)
                {
                    cur += xOffset;
                    end = cur + xRun;

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

            bmp.UnlockBits(bd);

            return bmp;
        }

Ty hodnoty na začítku jsou

unk = 640; width = 44; height = 36

Ale jakmile naahraju image a překonvertuju ho na stream a pak do BinReaderu tak mi to vyhodí úplně něco jiného.

private void LoadStream()
        {
            Stream stream = File.OpenRead("Data/spellbook.bmp");
            BinaryReader bin = new BinaryReader(stream);

            int unk = bin.ReadInt32();
            int width = bin.ReadInt16();
            int height = bin.ReadInt16();

        }

Hodnoty jsou unk = 1196314761; width = 2573; height = 2586

Nechápu to ale přitom právě se jedná o ten jeden a ten samej image. Kde je problém? Popřípadě jak bych to mohl řešit abych mohl takhle z .bmp formátu vkládat do toho tu grafiku?

Jako vím, že width a height můžu pak načítat jinak, ale mě by prostě zajímalo jak mám udělat aby se ten stream rovnal aspon to abych mohl to tam vložit.

Popřípadě tady je ten formát nastíněn http://wpdev.sourceforge.net/docs/formats/csharp/art.html Jde hlavně o Statics né Land.

Díky moc za pomoc.

Nahlásit jako SPAM
IP: 89.190.90.–
zlz
~ Anonymní uživatel
634 příspěvků
Nahlásit jako SPAM
IP: 78.156.159.–
Mutagen0
Super člen
17. 6. 2013   #3
-
0
-

#2 zlz
Tak to jsi mě teda opravdu pomohl.  

Nahlásit jako SPAM
IP: 89.190.90.–
zlz
~ Anonymní uživatel
634 příspěvků
17. 6. 2013   #4
-
0
-

Nepochopil jsem, co přesně chceš udělat. Tak jsem se jen pokusil osvětlit, proč ti to načítá "divné" hodnoty.

Pokud chceš načíst to bmp do Bitmap, tak nemusíš formát řešit sám, stačí new Bitmap(cesta);

Nahlásit jako SPAM
IP: 78.156.159.–
Mutagen0
Super člen
17. 6. 2013   #5
-
0
-

#4 zlz
No tak je jasný, že jsi nepochopil, ale přitom to nahoře docela dobře vysvětluju + ukázka kódu.

Jde prostě o to, že mam soubor ve kterým je schovaná grafika do hry podle indexu si vybírám jakou grafiku zobrazím a já potřebuju aby když si to grafiku uložím a pak bych jí chtěl nahrát zpět na to samý místo třeba upravenou tak aby to dalo ten formát správnej. Ta moje fce co mam na LoadStreamu je fakt blbost, protože v tom souboru jsou na těhlech místech uložený informace o obrázku (šírka/výška) ale prostě jde mi o to, že ten stream co dostanu z tý funkce tak bych potřeboval aby se pak rovnal streamu z obrázku co nahraju já (stejnej obrázek) ale z uloženýho souboru třeba bmp nebo JPG.

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, 14 hostů

Podobná vlákna

Iterovani ve streamu — založil Jakoby

Adresy streamů na bbc — založil Návštěvník

Otazka ohledne STREAMu — založil KiroNet

Ulozenie metadat zo streamu — založil playman22

 

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