T O P I C R E V I E W |
davenovo |
Posted - Jan 06 2013 : 19:24:07 Hello,
I am having a problem loading a PNG file. I have put the code below in just a button click to show the problem
procedure TForm1.Button1Click(Sender: TObject); const FNAME='c:\temp\spiderman.png'; var bmp: TBitmap; iebmp: TIEBitmap; tmpImageIO: TImageEnIO; tmpPicture: TPicture; begin iebmp:=TIEBitmap.Create; tmpImageIO:=TImageEnIO.Create(nil); tmpImageIO.AsyncMode:=False; tmpImageIO.StreamHeaders:=False; tmpImageIO.AttachedIEBitmap:=iebmp; // tmpImageIO.Params.PNG_Background:=TColor2TRGB(clWhite); // tmpImageIO.Params.BMP_HandleTransparency:=True; tmpImageIO.LoadFromFile(FNAME); bmp:=TBitmap.Create; ieBmp.CopyToTBitmap(bmp); bmp.SaveToFile('c:\temp\made_with_imageEn.bmp'); bmp.Free; tmpImageIO.Free; ieBmp.Free; end;
I have attached the photo. When it saves, it has a black background. If I look at it in any image editor, the background is white. Any ideas?
Even if I uncomment the lines above, it still does not work. Any tips?
1008.84 KB |
11 L A T E S T R E P L I E S (Newest First) |
fab |
Posted - Jan 09 2013 : 01:53:08 This image hasn't background, but an alpha mask. In order to make the background white you have to remove alpha mask and replace with white:
iebmp:=TIEBitmap.Create;
tmpImageIO:=TImageEnIO.Create(nil);
tmpImageIO.AttachedIEBitmap:=iebmp;
tmpImageIO.LoadFromFile(FNAME);
tmpImageIO.IEBitmap.RemoveAlphaChannel(true, clWhite); <<<< here
bmp:=TBitmap.Create;
ieBmp.CopyToTBitmap(bmp);
bmp.SaveToFile('c:\tempworks\made_with_imageEn.bmp');
bmp.Free;
tmpImageIO.Free;
ieBmp.Free;
In order to set the PNG background color info, execute instead:
tmpImageIO.IEBitmap.RemoveAlphaChannel(true, TRGB2TColor(tmpImageIO.Params.PNG_Background));
Anyway PNG_Background read from this PNG is black, so you will get a black background. |
w2m |
Posted - Jan 08 2013 : 05:57:17 support@hicomponents.com
William Miller |
davenovo |
Posted - Jan 07 2013 : 23:17:52 This is supporting a bit of legacy code. Right now the images are being rendered by painting them onto the forms canvas.
They are being stored in a TPicture.Graphic.Bitmap property.
Right now, if its a PNG, I use TPicture.LoadFromFile to load the PNG. It seems that currently the DevExpress PNG parser is being used, because it has registered the PNG file format using Delphi's RegisterFileFormat call. When I load it into TPicture like that, and do a stretchdraw to draw it on the form, it is fine.
For all other file formats, I use ImageEn to load the image, then put it in a TBitmap and stick the TBitmap into the TPicture. Graphic.
The problem became when I started using ImageEn to stretch the image instead of stretchdraw. Everything worked much better, because stretchdraw sucks. However, the PNGs screwed up by having a black background. I determined this happened upon initial loading of the PNG via the code I showed above.
What is the best way to get in touch with fabricio these days. just email support? |
w2m |
Posted - Jan 07 2013 : 11:48:20 Sorry.. I missed or overlooked that part.
As best as I can determine viewing a 32-bit bitmap with alphachannel is dependent on the viewing component or application. For example when you save a 32-bit bitmap with alphachannel with ImageEn, then view the file in Windows Explorer or many other apps the transparency is not shown even though the alpha information is present in the file.
So... it looks like it depends on what you are going to use to view the file.
I got this from StackOverflow:
First of all, you should know that transparent BMP's are very uncommon. Hence, many (most) bitmap viewers, encoders, and decoders do not support transparent bitmaps. However, there is some hope. First of all, many bitmaps are 32-bit, even though the pixels most often are stored in the format $00BBGGRR. The first byte of each "pixel" is hence unused, and one could of course use this as the opacity value: $AABBGGRR. But this is not only my personal ideas. Most bitmaps use the version 3 bitmap header, but version 4 (and version 5) actually supports transparency data. You simply specify the red, green, blue, and alpha masks (e.g. $000000FF, $0000FF00, $00FF0000, and $FF000000, respectively) and then you can store red, green, blue, and alpha intensities per pixel.
Still, as I said, most bitmap viewers, encoders, and decoders doesn't support transparent bitmaps. I think that the VCL encoders, decoders, and viewer (TImage) don't.
I would consider using PNG instead of BMP. The PNG bitmap image format supports transparency in a lot of different ways.
Andreas Rejbrand
In my work with ImageEn and 32-bit bitmap with alphachannel I have found that the simplest thing to do is use PNG as referenced by Andreas. Transparency with png is nearly automatic.
Sorry I could not be more helpful. You next bet is to email Fabrizio and get his expert opinion on this problem.
I am wondering why is it absolutely necesary to use bitmaps in your case?
What component or app are you going to use to view the bitmap?
William Miller Email: w2m@frontiernet.net EBook: http://www.imageen.com/ebook/ Apprehend: http://www.frontiernet.net/~w2m/index.html |
davenovo |
Posted - Jan 07 2013 : 10:32:35 Hi William,
I must be missing something. First of all I am not using an ImageEnView, nor do I want to. I simply want to load a file as a PNG and save it as a BMP, where if there was transparency, the background will be white, or the resulting BMP will be marked with a transparentColor.
Note in the sample code I posted I did not have an ImageEnView, I just loaded the file and tried to save it. |
w2m |
Posted - Jan 07 2013 : 09:48:44 This example does not save and reload the file... when you open a bitmap file it is shown with transparancy. The background color is controled by the background color with images with alphachannel. The saving mearly saves the image as a bitmap which is what you were trying to accomplish. What are you referring to?
William Miller |
davenovo |
Posted - Jan 07 2013 : 09:25:13 Hi William,
Although this may work, loading and saving and then re-loading files to disk is not an optimal way of moving information around within a program. Is there not a way to do this without saving and reloading the image to / from disk. |
w2m |
Posted - Jan 07 2013 : 08:46:32 I already told you how... After loading the image into tmpImageIO you should use tmpImageIO.SaveToFileBMP... do not use TBitmap at all. But for TBitmap in ImageEn you must set tmpImageIO.Params.BMP_HandleTransparency:=True;
Here is an example that saves the image as a bitmap with the alphachannel:
procedure TForm2.FormCreate(Sender: TObject);
begin
ImageEnView1.IO.Params.BMP_HandleTransparency := True;// Important!!
end;
procedure TForm2.SaveAs1Click(Sender: TObject);
var
iFilename: string;
begin
// This is a dialog component available with my Ebook
if IEWin7FileSaveDialog1.Execute then
begin
iFileName := IEWin7FileSaveDialog1.FileName;
ImageEnView1.IO.SaveToFile(iFileName);
UpdateStatusbar;
end;
end; After saving the file if you reopen the file in imageen the background will be transparent as shown in an imageen application below: 172.32 KB
If you want the transparent color to be white with a solid background just call:
ImageEnView1.Background := clWhite;
ImageEnView1.BackgroundStyle := iebsSolid;
William Miller Email: w2m@frontiernet.net EBook: http://www.imageen.com/ebook/ Apprehend: http://www.frontiernet.net/~w2m/index.html |
davenovo |
Posted - Jan 07 2013 : 08:11:08 The problem is that I use ImageEn to read in various image formats, then save the image to a BMP as a common format that I then display it to the user. For many different PNGs, it is coming up with a black background.
I cannot manually set the background colors because I dont know what they are in general. I feel the library should be able to load any PNG and then be able to copy it to a bitmap.
How can I specify that if there is an alpha channel in the original PNG, to have the background white when copying to the bitmap? |
Patrick Quinn |
Posted - Jan 07 2013 : 07:49:07 There is a post about if Delphi's PNG library is being used instead of ImageEn's this causes problems. Don't know if that helps. http://www.imageen.com/ieforum/topic.asp?TOPIC_ID=803 and see last comment at http://www.imageen.com/ieforum/topic.asp?TOPIC_ID=357
regards
Patrick |
w2m |
Posted - Jan 07 2013 : 06:42:27 PNG images usually do not requre any special processing to load correctly, but try tmpImageIO.Params.PNG_Background:=TColor2TRGB(clBlack) and/or ImageEnView1.Proc.SetTransparentColors(TColor2TRGB(clBlack), TColor2TRGB(clBlack),0) after loading the image. The problem may also be that you loose the alphachannel when calling ieBmp.CopyToTBitmap(bmp); ieBmp.CopyToTBitmap(bmp) does not support the alphachannel.
You also create tmpImageIO but then your code does not use the image it loads at all?
What are you trying to accomplish? After loading the image into tmpImageIO you could just try tmpImageIO.SaveToFileBMP
William Miller Email: w2m@frontiernet.net EBook: http://www.imageen.com/ebook/ Apprehend: http://www.frontiernet.net/~w2m/index.html |
|
|