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.