Solved

how can i fill the different color with the region  separate by the black line?

Posted on 2002-06-17
20
180 Views
Last Modified: 2010-04-04
hi,
  experts,please help me,
the image in here:
http://www26.brinkster.com/jbaswjy
i want to fill the different color with the region seperate by the black line,how can i do?
 thanks
0
Comment
Question by:jbas
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 6
  • 3
  • +2
20 Comments
 
LVL 2

Expert Comment

by:333
ID: 7086151
use TCanvas.FloodFill
for example:
  Image1.Picture.Bitmap.Canvas.Brush.Style:=bsSolid;
  Image1.Picture.Bitmap.Canvas.Brush.Color:=clBlue;
  Image1.Picture.Bitmap.Canvas.FloodFill(1, 1, clWhite, fsSurface);

this will paint your region (topmost on the left) with blue.
0
 

Author Comment

by:jbas
ID: 7086482
to 333
 thanks!but it not work ,mybe you not understond my meaning,i want to fill different color in a timage.and the image first assign a picture,like  this :http://www26.brinkster.com/jbaswjy
and second i hope to fill different color in the image,separate by the black line area!
thanks!
0
 
LVL 7

Expert Comment

by:Cynna
ID: 7086564
jbas,

1. So, if I got you right, you want to fill each region
   with different color, right?

2. These regions are enclosed with black line, and "filled"
   with white color, right?

3. Do you have some idea what are these colors for each
   region, or do you just want to have regions filled
   with random colors ?

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:jbas
ID: 7086680
to  Cynna :
  thanks to you answer!
>>1. So, if I got you right, you want to fill each region
>>  with different color, right?
yes!
>>2. These regions are enclosed with black line, >>and "filled"  with white color, right?
yes!
>>3. Do you have some idea what are these colors for each
>>  region, or do you just want to have regions filled
>>  with random colors ?
random colors!
i waiting you answer! thanks!
0
 
LVL 3

Expert Comment

by:Slavak
ID: 7086745
it sounds as common task to color a map with 4 different colors, isn't it?
0
 
LVL 2

Accepted Solution

by:
333 earned 80 total points
ID: 7087036
jbas,

this works for me (i assume, that bitmap is monochrome):

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: integer;
begin
  // Load bitmap
  Image1.Picture.LoadFromFile('d:\temp\temp.bmp');
  // If it's monochrome, make it color
  Image1.Picture.Bitmap.PixelFormat:=pf8bit;
  Randomize;
  // Go thru bitmap pixel by pixel
  for i:=0 to Image1.Picture.Bitmap.Width-1 do
    for j:=0 to Image1.Picture.Bitmap.Height-1 do
  // See if pixels color is white
  //  If white then FloodFill area with random color
      if Image1.Picture.Bitmap.Canvas.Pixels[i,j]=clWhite then begin
        Image1.Picture.Bitmap.Canvas.Brush.Color:=StringToColor(Format('$00%0.2x%0.2x%0.2x',[Random(254),Random(254),Random(254)]));
        Image1.Picture.Bitmap.Canvas.FloodFill(i,j,clWhite,fsSurface);
      end;
end;

0
 
LVL 7

Expert Comment

by:Cynna
ID: 7087092
jbas,

333 gave you the wright answer.
Copy/Paste that example, it will do what you want.

0
 

Author Comment

by:jbas
ID: 7089223
thank!
   when i use bmp,it can work well ,but when i use jpg,it can not work!why?
0
 

Author Comment

by:jbas
ID: 7091264
333 ,Cynna :
  thanks!i should .jpg ->.bmp ,and do your code to finished my work?
0
 
LVL 2

Expert Comment

by:333
ID: 7091881
well, to use .jpg you should add unit JPEG to your form.
for example:

uses Windows,Forms,...,JPEG;

after that, you will be able to load .jpg .
however, TJPEGImage doesn't have canvas property, so you wont be able to paint on it (fill regions). you will need to copy image on to bitmap, in order to paint on it.

so, here is some changes you need to make in order to use jpg:

1) add JPEG to your form
uses Windows,Forms,...,JPEG;

2) and my previous procedure should look like this:
procedure TForm1.Button1Click(Sender: TObject);
var
 i,j: integer;
 JPGImage : TJPEGImage;
 ImageFileName: string;
begin
 // Name of your image file
 ImageFileName:='d:\temp\temp.jpg';

 // Check here for image file extension, so you know if it's jpg or bmp
 if LowerCase(ExtractFileExt(ImageFileName))='.bmp' then begin
 // Load bitmap
   Image1.Picture.LoadFromFile(ImageFileName);
 // If it's monochrome, make it color
   Image1.Picture.Bitmap.PixelFormat:=pf8bit;
 end
 else begin
 // Process jpg image
   JPGImage := TJPEGImage.Create;
   JPGImage.LoadFromFile(ImageFileName);
 // Copy jpg to bitmap
   Image1.Picture.Assign(JPGImage);
   JPGImage.Free;
 end;

 Randomize;
 // Go thru bitmap pixel by pixel
 for i:=0 to Image1.Picture.Bitmap.Width-1 do
   for j:=0 to Image1.Picture.Bitmap.Height-1 do
 // See if pixels color is white
 //  If white then FloodFill area with random color
     if Image1.Picture.Bitmap.Canvas.Pixels[i,j]=clWhite then begin
       Image1.Picture.Bitmap.Canvas.Brush.Color:=StringToColor(Format('$00%0.2x%0.2x%0.2x',[Random(254),Random(254),Random(254)]));
       Image1.Picture.Bitmap.Canvas.FloodFill(i,j,clWhite,fsSurface);
     end;
end;

0
 

Expert Comment

by:hgbdelphi
ID: 7092309
sorry,it can not work well.please help me.

procedure Tsimulate.Button1Click(Sender: TObject);
var
  i,j: integer;
  JPGImage : TJPEGImage;
  ImageFileName: string;
  icolor:Tcolor;
  wb:boolean;
begin
   if OpenPictureDialog1.Execute then
   begin
       ImageFileName:=OpenPictureDialog1.FileName;
       if LowerCase(ExtractFileExt(ImageFileName))='.bmp' then
         Imagbf.Picture.LoadFromFile(ImageFileName)
       else
       begin
        JPGImage := TJPEGImage.Create;
        JPGImage.LoadFromFile(ImageFileName);
        Imagbf.Picture.Assign(JPGImage);
        JPGImage.Free;
       end;
   end;
//   repaint;
   Randomize;

 for i:=0 to Imagbf.Picture.Bitmap.Width-1 do
 for j:=0 to Imagbf.Picture.Bitmap.Height-1 do
 if Imagbf.Picture.Bitmap.Canvas.Pixels[i,j]=clWhite then
 begin
    icolor:= rgb(random(1000),random(1000),random(1000));
    if (icolor<>clblack) and (icolor<>clwhite) then
    begin
       Imagbf.Picture.Bitmap.Canvas.Brush.Color:=icolor;
       Imagbf.Picture.Bitmap.Canvas.FloodFill(i,j,clWhite,fsSurface);
    end;
 end;

  repaint;
{
 for i:=0 to Imagbf.Picture.Bitmap.Height-1 do
 for j:=0 to Imagbf.Picture.Bitmap.Width-1 do
 begin
     wb:=false;
     if Imagbf.Picture.Bitmap.Canvas.Pixels[j,i]=clblack then
     begin
            Imagbf.Picture.Bitmap.Canvas.Pixels[j,i]:=Imagbf.Picture.Bitmap.Canvas.Pixels[j-1,i];
            wb:=true;
     end;
     if Imagbf.Picture.Bitmap.Canvas.Pixels[j+1,i]=clblack then
     begin
       if wb=true then
       Imagbf.Picture.Bitmap.Canvas.Pixels[j+1,i]:=Imagbf.Picture.Bitmap.Canvas.Pixels[j+2,i];
       wb:=false;
     end;
 end;
 repaint;
 Btnmn.Enabled:=true;
 }
end;
0
 
LVL 2

Expert Comment

by:333
ID: 7092327
what exactly is wrong? empty bitmap? bad colors? regions aren
't filled?
0
 

Expert Comment

by:hgbdelphi
ID: 7092331
sorry,it can not work well.please help me.

procedure Tsimulate.Button1Click(Sender: TObject);
var
  i,j: integer;
  JPGImage : TJPEGImage;
  ImageFileName: string;
  icolor:Tcolor;
  wb:boolean;
begin
   if OpenPictureDialog1.Execute then
   begin
       ImageFileName:=OpenPictureDialog1.FileName;
       if LowerCase(ExtractFileExt(ImageFileName))='.bmp' then
         Imagbf.Picture.LoadFromFile(ImageFileName)
       else
       begin
        JPGImage := TJPEGImage.Create;
        JPGImage.LoadFromFile(ImageFileName);
        Imagbf.Picture.Assign(JPGImage);
        JPGImage.Free;
       end;
   end;
//   repaint;
   Randomize;

 for i:=0 to Imagbf.Picture.Bitmap.Width-1 do
 for j:=0 to Imagbf.Picture.Bitmap.Height-1 do
 if Imagbf.Picture.Bitmap.Canvas.Pixels[i,j]=clWhite then
 begin
    icolor:= rgb(random(1000),random(1000),random(1000));
    if (icolor<>clblack) and (icolor<>clwhite) then
    begin
       Imagbf.Picture.Bitmap.Canvas.Brush.Color:=icolor;
       Imagbf.Picture.Bitmap.Canvas.FloodFill(i,j,clWhite,fsSurface);
    end;
 end;

  repaint;
{
 for i:=0 to Imagbf.Picture.Bitmap.Height-1 do
 for j:=0 to Imagbf.Picture.Bitmap.Width-1 do
 begin
     wb:=false;
     if Imagbf.Picture.Bitmap.Canvas.Pixels[j,i]=clblack then
     begin
            Imagbf.Picture.Bitmap.Canvas.Pixels[j,i]:=Imagbf.Picture.Bitmap.Canvas.Pixels[j-1,i];
            wb:=true;
     end;
     if Imagbf.Picture.Bitmap.Canvas.Pixels[j+1,i]=clblack then
     begin
       if wb=true then
       Imagbf.Picture.Bitmap.Canvas.Pixels[j+1,i]:=Imagbf.Picture.Bitmap.Canvas.Pixels[j+2,i];
       wb:=false;
     end;
 end;
 repaint;
 Btnmn.Enabled:=true;
 }
end;
0
 

Expert Comment

by:hgbdelphi
ID: 7092333
sorry,it can not work well.please help me.

procedure Tsimulate.Button1Click(Sender: TObject);
var
  i,j: integer;
  JPGImage : TJPEGImage;
  ImageFileName: string;
  icolor:Tcolor;
  wb:boolean;
begin
   if OpenPictureDialog1.Execute then
   begin
       ImageFileName:=OpenPictureDialog1.FileName;
       if LowerCase(ExtractFileExt(ImageFileName))='.bmp' then
         Imagbf.Picture.LoadFromFile(ImageFileName)
       else
       begin
        JPGImage := TJPEGImage.Create;
        JPGImage.LoadFromFile(ImageFileName);
        Imagbf.Picture.Assign(JPGImage);
        JPGImage.Free;
       end;
   end;
//   repaint;
   Randomize;

 for i:=0 to Imagbf.Picture.Bitmap.Width-1 do
 for j:=0 to Imagbf.Picture.Bitmap.Height-1 do
 if Imagbf.Picture.Bitmap.Canvas.Pixels[i,j]=clWhite then
 begin
    icolor:= rgb(random(1000),random(1000),random(1000));
    if (icolor<>clblack) and (icolor<>clwhite) then
    begin
       Imagbf.Picture.Bitmap.Canvas.Brush.Color:=icolor;
       Imagbf.Picture.Bitmap.Canvas.FloodFill(i,j,clWhite,fsSurface);
    end;
 end;

  repaint;
{
 for i:=0 to Imagbf.Picture.Bitmap.Height-1 do
 for j:=0 to Imagbf.Picture.Bitmap.Width-1 do
 begin
     wb:=false;
     if Imagbf.Picture.Bitmap.Canvas.Pixels[j,i]=clblack then
     begin
            Imagbf.Picture.Bitmap.Canvas.Pixels[j,i]:=Imagbf.Picture.Bitmap.Canvas.Pixels[j-1,i];
            wb:=true;
     end;
     if Imagbf.Picture.Bitmap.Canvas.Pixels[j+1,i]=clblack then
     begin
       if wb=true then
       Imagbf.Picture.Bitmap.Canvas.Pixels[j+1,i]:=Imagbf.Picture.Bitmap.Canvas.Pixels[j+2,i];
       wb:=false;
     end;
 end;
 repaint;
 Btnmn.Enabled:=true;
 }
end;
0
 

Author Comment

by:jbas
ID: 7092340
i use the code but empty bitmap,why?
0
 

Author Comment

by:jbas
ID: 7092882
to 333 ,Cynna :
  thanks!i do not finished it,i use:
             imagbf.Picture.Assign(JPGImage);
i shoule trans .jpg to .bmp????
0
 
LVL 2

Expert Comment

by:333
ID: 7092953
oops, sorry, my mistake :)

change the line where you assign JPEG image to TImage from
  Image1.Picture.Assign(JPGImage);
to
  Image1.Picture.Bitmap.Assign(JPGImage);

or in your code change the line from your last post from  imagbf.Picture.Assign(JPGImage);
to
  imagbf.Picture.Bitmap.Assign(JPGImage);
0
 

Author Comment

by:jbas
ID: 7094260
333,
  thanks to answer my question!
  but if i use image1.picture.bitmap.assign(jpgimage),it can appear the picture in timage,but the picture is not clear,do not finished my work.
  how can i do it ?
0
 
LVL 2

Expert Comment

by:333
ID: 7094955
what do you mean "the picture is not clear"? is there lot of white space that isn't filled?
if yes, then this is because your jpg image is not 100% white. due to jpg compression some pixels in image are not RGB(255,255,255), but their value is something near white, for example RGB(253,250,254), so those pixels will not be filled.
the best solution would be to use monochrome bitmaps (with only two colors - 100% white and 100% black).
another solution would be to convert loaded jpg image to monochrome and then back to color. to do this add this to your code (right after line Randomize;):

Image1.Picture.Bitmap.Monochrome:=true;
Image1.Picture.Bitmap.PixelFormat:=pf16bit;
but as you will see, your picture will be very scary :) this is because when converting to monochrome, delphi converts each pixel that is not 100% white to 100% black. so if you have gray pixel, that is very near to white (i.e. RGB(253,255,255)) it will be converted to clBlack.
as a workaround you may instead of those two lines add this loop:
for i:=0 to Image1.Picture.Bitmap.Width-1 do
  for j:=0 to Image1.Picture.Bitmap.Height-1 do
    if (GetRValue(Image1.Picture.Bitmap.Canvas.Pixels[i,j])>30) and
       (GetGValue(Image1.Picture.Bitmap.Canvas.Pixels[i,j])>30) and
       (GetBValue(Image1.Picture.Bitmap.Canvas.Pixels[i,j])>30) then
      Image1.Picture.Bitmap.Canvas.Pixels[i,j]:=clWhite
    else
      Image1.Picture.Bitmap.Canvas.Pixels[i,j]:=clBlack;

this will set any pixel that is darker than RGB(30,30,30) to black and any others to white.
0
 

Author Comment

by:jbas
ID: 7095288
thanks ,my english is poor ,sorry!
Cynna ,!because the points can not share,sorry!
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
Attackers love to prey on accounts that have privileges. Reducing privileged accounts and protecting privileged accounts therefore is paramount. Users, groups, and service accounts need to be protected to help protect the entire Active Directory …
This video shows how to use Hyena, from SystemTools Software, to update 100 user accounts from an external text file. View in 1080p for best video quality.

751 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question