problem in setiing pixel values in the raw bits of the DIB of 24 bit image?
Hi,
I am working on delphi-7. I have set of pixel values(ie to draw scribbles(colored lines) on image),I want to set the pixels by using the DIB raw bits, My codse is as given below,
if ((y>0) and (y<Height) and (x<Width) and (x>0)) then
begin
row := (Width *(Height - y)+x)*3; // (w2*(h2-j)+i)*3;
(L_PUCHAR(integer(drawbits)+row+2))^ := GetRValue(col);
(L_PUCHAR(integer(drawbits)+row+1))^ := GetGValue(col);
(L_PUCHAR(integer(drawbits)+row))^ := GetBValue(col);
end;
StretchDIBits(hdc_draw,0,0,Width,Height,0,0,Width,Height,drawbits,pinfo_curstamp^,DIB_RGB_COLORS,SRCCOPY);
Where
drawbits is the raw bits obtained from DIB of 24 bit image.
It is working fine for some 24 bit images. But with Some 24 bit images it is jumping the scribbles(ie it is not drawing to the same position). Even I am stretching to the 24 RGB bits,I am not getting what is the problem. Please give me solution.
The problem might be related to to the fact that the row width is always a multiple of 4 bytes. I did not check your calculation, but it must take that into account.
For instance, if the calculation works for bitmaps that are exactly 320 bits wide but does not work for one that is 321 or 322 bytes wide, then that might be the problem. Can you check that out and see if it applies?
0
inampudi1Author Commented:
Hi DanRollins,
Thank you for reply,
I checked it is right what you are saying. suppose I have image with 317 by 318, Without resizing image how can I Change my DIB drawing algoritham. Please tell me.
Since you are working with Delphi why don't you assign the DIB to a TBitmap and access TBitmap->Canvas->Pixels[x][y] ??
George Tokas.
0
Here at Experts Exchange, we strive to give members the best experience. Help us improve the site by taking this survey today! (Bonus: Be entered to win a great tech prize for participating!)
Assigning DIB to bitmap and then processing pixel by pixel will take extra time, as compared to DIB. Since I am working with 2K resulution images, Pixel by pixel meands it will be slow.
Here is your calculation:
row := (Width *(Height - y)+x)*3;
The "Height-y" part is to reverse top and bottom. Let's remove that for now...
row := ((Width * y) +x)*3;
That is saying that each row is Width * 3 bytes long... The address then is y rows (of 3 bytes per pixel times the number of pixels in a row) plus x columns (of three bytes per pixel).
You need to adjust that so that when the Width is not a multiple of 4 pixels, then iou take that into consideration
nScanLineWide = ((Width+3) /4) * 4; // round up next multiple of 4
row := ((nScanLineWide* y) +x)*3;
(and adding back the top=bottom adjustment:
row := ((nScanLineWide * (Height - y) ) +x)*3; // BTW, 'row' is a bad name for this variable
Note: I did not actually test this, as I have no experience with Delphi. But the basic princlple is commonly used on C++ and Assembly Language coding, so I assume it applies here. Also, I'm assuming that variables and intermediate values are integer data type so that (z+3)/4 yields an integer.
0
Featured Post
Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.
One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.
For instance, if the calculation works for bitmaps that are exactly 320 bits wide but does not work for one that is 321 or 322 bytes wide, then that might be the problem. Can you check that out and see if it applies?