Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Geen (juiste) waarden bij unsafe bitmap processing

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende code:

C#:
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
unsafe class UnsafeBitmapLogic
    {
        public Int32[] GetTextlength(Int32 textW, Int32 textH, string text, Font f, Color textcolor, Color backcolor)
        {
            Bitmap bmp = new Bitmap(textW, textH, PixelFormat.Format32bppArgb);
            Graphics g = Graphics.FromImage((Image) bmp);
            Brush textb = new SolidBrush(textcolor);
            Brush bmpb = new SolidBrush(backcolor);
            g.FillRectangle(bmpb, 0.0f, 0.0f, textW, textH);
            g.DrawString(text, f, textb, 0.0f, 0.0f);
            Rectangle r = new Rectangle(0,0,textW, textH);
            BitmapData b1 = bmp.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
            byte* imagePointer1 = (byte*)(void*)b1.Scan0;
            Int32 nOffset = b1.Stride - (bmp.Width * 4);
            Int32 bw = bmp.Width * 4;
            Int32 i = 0;
            Int32 i1;
            Int32[] wh = new Int32[2] { 0, 0 };
            while(i < bmp.Height)
            {
                i1 = 0;
                while (i1 < bw)
                {
                    if ((imagePointer1[0] == textcolor.B)) //&& (imagePointer1[1] == textcolor.G) && (imagePointer1[2] == textcolor.R))
                    {
                        if (i1 > wh[0])
                        {
                            wh[0] = i1 / 4;
                        }
                        if (i > wh[1])
                        {
                            wh[1] = i;
                        }
                        imagePointer1 += 4;
                    }
                    imagePointer1 += nOffset;
                    i1 += 4;
                }
                i++;
            }
            bmp.UnlockBits(b1);
            g.Dispose();
            return wh;
        }


Diverse webpagina's heb ik er al op nageslagen maar de code blijft de verkeerde waarden teruggeven. Na het het uitvoeren zijn de resultaten 0 en 0.

Ik heb de bitmap al opgeslagen om te kijken of deze toevallig niet helemaal zwart is maar het wordt netjes een plaatje met text er in. Het draait gewoon onder de GUI thread.

De compiler geeft niets aan en alle websites geven soortgelijke code weer. Dus ik heb eigenlijk geen idee waar ik de fout zoeken moet. Kan iemand mij verder helpen?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Ik zie je nergens de bitmap openen? Het is trouwens gebruikelijk om de shorthand "int" te gebruiken ipv Int32.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 30-11 19:45

TeeDee

CQB 241

En als aanvulling: kan je niet beter een Size object teruggeven ipv een int[]?
Ten tweede neem ik aan dat je ook al door je method gestepped?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

riezebosch schreef op vrijdag 14 september 2007 @ 15:35:
Ik zie je nergens de bitmap openen? Het is trouwens gebruikelijk om de shorthand "int" te gebruiken ipv Int32.
Doet ie op regel 6.

Hij opent die niet, hij creeert eentje, met een text op.

Going for adventure, lots of sun and a convertible! | GMT-8


  • rickpastoor
  • Registratie: Februari 2003
  • Laatst online: 06-11-2021
Klopt het dat je (onder andere) probeert de beedte van een regel tekst op te vragen? Misschien kun je daarvoor gebruik maken van de Graphics.MeasureString methode, dat scheelt een hoop debugwerk ;) (http://msdn2.microsoft.com/en-us/library/6xe5hazb.aspx)

[ Voor 3% gewijzigd door rickpastoor op 14-09-2007 17:22 ]


Verwijderd

Topicstarter
rickpastoor schreef op vrijdag 14 september 2007 @ 17:20:
Klopt het dat je (onder andere) probeert de beedte van een regel tekst op te vragen? Misschien kun je daarvoor gebruik maken van de Graphics.MeasureString methode, dat scheelt een hoop debugwerk ;) (http://msdn2.microsoft.com/en-us/library/6xe5hazb.aspx)
Ik ken de MeasureString method maar deze geeft nooit de exacte lengte van de string weer. Vaak met +20 pixels aan wijdte extra . Er is nog een andere methode (Codeproject) die wel de juiste lengte weer zou moeten geven maar blijkbaar pakte die de speciale effectjes ook niet mee. Daarnaast wil ik binnenkort wat serieuzer image processing werk gaan doen (image sharpening) en met setpixel en getpixel is dat geen goed idee :) .

Vandaar dat het wel handig is dat ik erachter kom wat er fout gaat :) .

Edit:
Hmm nu ik eens rustig naar die code kijk zie ik dat
C#:
1
imagePointer1 += 4;

en
C#:
1
imagePointer1 += nOffset;


op wel heel vreemde plaatsen staan... Misschien moet ik die maar eens even ergens anders neer gaan zetten. Mocht dat nog niet gaan werken dan post ik wel weer :) .

[ Voor 15% gewijzigd door Verwijderd op 14-09-2007 22:35 ]

Pagina: 1