Autor Beitrag
dall
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 24.12.08 16:39 
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:

ausblenden volle Höhe 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
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 24.12.08 17:22 
: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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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:

ausblenden 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 :)