Entwickler-Ecke

Multimedia / Grafik - problem beim unsafe-arbeiten in bitmaps


dall - Mi 24.12.08 16:39
Titel: problem beim unsafe-arbeiten in bitmaps
ich programmiere gerade ein tool, das zwei bilder in eine große bitmap untereinander packt (siehe anhang: bild1). ahnung hab ich wenig, aber ich gebe mein bestes ;)

hier ist der code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
BitmapData Bild1Data = Bild1.LockBits(new Rectangle(00, Bild1.Width, Bild1.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
int Bild1Stride = Bild1Data.Stride;
System.IntPtr Bild1Scan0 = Bild1Data.Scan0;

BitmapData Bild2Data = Bild2.LockBits(new Rectangle(00, Bild2.Width, Bild2.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
int Bild2Stride = Bild2Data.Stride;
System.IntPtr Bild2Scan0 = Bild2Data.Scan0;

BitmapData NeuesBildData = NeuesBild.LockBits(new Rectangle(00, NeuesBild.Width, NeuesBild.Height),  ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
int NeuesBildStride = NeuesBildData.Stride;
System.IntPtr NeuesBildScan0 = NeuesBildData.Scan0;

unsafe
{
    byte* Bild1p = (byte*)(void*)Bild1Scan0;
    int Bild1nOffset = Bild1Stride - Bild1.Width * 3;
    byte* Bild2p = (byte*)(void*)Bild2Scan0;
    int Bild2nOffset = Bild2Stride - Bild2.Width * 3;
    byte* NeuesBildp = (byte*)(void*)NeuesBildScan0;
    int NeuesBildnOffset = NeuesBildStride - NeuesBild.Width * 3;

    bool Bild1Zaehlen = true;
    bool Bild2Zaehlen = false;

    for (int y = 0; y < NeuesBild.Height; y++)
    {
        for (int x = 0; x < NeuesBild.Width; x++)
        {
            if ((y < Bild1.Height) && (x < Bild1.Width))
            {
                Bild1Zaehlen = true;
                Bild2Zaehlen = false;
                NeuesBildp[0] = Bild1p[0];
                NeuesBildp[1] = Bild1p[1];
                NeuesBildp[2] = Bild1p[2];
            }
            else if ((y >= Bild1.Height) && (x < Bild2.Width))
            {
                Bild1Zaehlen = false;
                Bild2Zaehlen = true;
                NeuesBildp[0] = Bild2p[0];
                NeuesBildp[1] = Bild2p[1];
                NeuesBildp[2] = Bild2p[2];
            }
            else
            {
                Bild1Zaehlen = false;
                Bild2Zaehlen = false;
                NeuesBildp[0] = 255;
                NeuesBildp[1] = 255;
                NeuesBildp[2] = 255;
            }

            // spalte raufzählen
            if (Bild1Zaehlen)
            Bild1p += 3;
            if (Bild2Zaehlen)
            Bild2p += 3;
            NeuesBildp += 3;
        }

        // reihe raufzählen
        if (Bild1Zaehlen)
        Bild1p += Bild1nOffset;
        if (Bild2Zaehlen)
        Bild2p += Bild2nOffset;
        NeuesBildp += NeuesBildnOffset;
    }

    Bild1.UnlockBits(Bild1Data);
    Bild2.UnlockBits(Bild2Data);
    NeuesBild.UnlockBits(NeuesBildData);

// unsafe



das problem ist folgendes: sobald nur ein bild von beiden hochkant ist und das andere längs, wird das hochkante verzerrt. pro reihe ist immer ein pixel schwarz und das ganze schiebt sich vor (anhang bild2). bei anderen bildern funktionierts. weiß jemand rat? ich vermute ja, dass es an den if-bedingungen liegt, kann mir aber nichts genaues vorstellen.

vielen dank für jede hilfe,
mareike


Kha - Mi 24.12.08 17:22
Titel: Re: problem beim unsafe-arbeiten in bitmaps
:welcome:
user profile icondall hat folgendes geschrieben Zum zitierten Posting springen:
ahnung hab ich wenig, aber ich gebe mein bestes ;)
LockBits, Pointer... "wenig Ahnung" sieht anders aus ;) . Ist allerdings schon viel zu kompliziert, es geht wesentlich leichter:
Hole dir eine Graphics-Instanz von NeuesBild durch Graphics.FromImage (in einem using-Block) und zeichne die zwei Bilder durch DrawImagehinein. Fertig :D .


dall - Mi 24.12.08 18:44

wahnsinn - vielen dank!! wie konnte ich mir nur so viel arbeit auf so komplizierte art machen ;)

hab's jetzt einfach so gelöst:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Bitmap NeuesBild = new Bitmap(iBreite, iHoehe);
NeuesBild.SetResolution(Bild1.VerticalResolution, Bild1.HorizontalResolution);

Graphics grfx_NeuesBild = Graphics.FromImage(NeuesBild);
grfx_NeuesBild.Clear(Color.White);
grfx_NeuesBild.DrawImage(Bild1, new Point(00));
grfx_NeuesBild.DrawImage(Bild2, new Point(0, Bild1.Height));
grfx_NeuesBild.Dispose();


und es sieht genauso aus, wie ich es haben wollte.. und geht um ein vielfaches schneller! :D was für ein schönes weihnachtsgeschenk, kha :)