Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
one bit transparency
#1
Hi,

in CorelDraw, it is (was?) possible to render a one bit (b&w) image as an arbitrary solid colour for black and transparent for white.  Note that this involved no blending or increase in bit width of the image.

I'm trying to do the same thing with GIMP and Inkscape (which sadly lacks this incredibly useful and probably not too difficult to implement feature).

So far all I've managed is an RGBA exported to png with a constant RGB and a high contrast alpha.  It seems to be impossible to prevent some degree of 'anti-aliasing'.

I can import this into Inkscape and lay it over a coloured background, but when I export it,  it's alpha blended, even though I didn't ask for that.  Again, it seems to be impossible to prevent 'anti-aliasing'.

Also, for some reason, Inkscape adds a transparency checker pattern to the background (which is not visible in the edit window).

Surely there's a way to create a one bit transparency in GIMP and render it in colour in Inkscape, then export it without alpha or checkers!

Even better would probably be to do it all in GIMP, but I still need the absence of blending, just the one bit transparency.
UPDATE: I've figured out how to do this in GIMP, but I'd still really like to know if and how I can create and export a one bit colour + transparency image.


Heelp me....  heelp meee...   pleeezzzzz.....

bitrat
Reply
#2
I think this is what you want :
Use Colours / Threshold (use the sliders to optimase result)
Select the black or white with the 'Select by Colour Tool'
Delete the selection
Image / Mode / Indexed (Use black and white (1-bit) palette)
The checkerboard is only gimp tranparent background, it is not visible on the exported image. If you make a screendump, then it is visble on the result image because you get all the visible information as you see it on the screen. 
   
Reply
#3
(11-05-2022, 09:16 AM)denzjos Wrote: Image / Mode / Indexed (Use black and white (1-bit) palette)

Thanks denzjos.  That's a good idea to add the alpha then convert mode.  I thought it solved the problem, but unfortunately it doesn't (quite) work...

Here's what I do (that doesn't work).
  1. create a black and white image with redundant bit width (RGB or grayscale)
  2. add a layer mask
  3. copy bw image to layer mask
  4. fill image layer with solid black
  5. convert to 1-bit indexed image mode [ Image | Mode | ...Indexed -> Use black and white (1-bit) palette ]
Unfortunately, although I ask for a 1-bit palette, the result is an antialiased 8-bit palette.  (I'd call this a bug, because I'm not prevented from selecting the 1-bit palette.)

What I want is black+transparent, rather than black+white.  I'm reasonably sure there are other ways to accomplish this.  Unless it's actually impossible to do with PNG, I could probably write a C program to get wiw in 5 minutes.  It's effectively a black sprite and I'm fairly sure it's possible in most icon file formats.

I'd also like to solve the associated Inkscape issue so, if any Inkscape aficionados out there can help, that would also be appreciated!

Cheers!
Reply
#4
This has come up before see: https://www.gimp-forum.net/Thread-Export...with-Alpha

I do not know how you get a anti-alised 8-bit palette, even with Gimp 2.10 which throws in an extra indexed entry you just get 2 

Work-flow:
Black-on-White image
Colour-to-Alpha to make black on transparent
Mode -> Indexed 1 bit.

You do not say which OS you are using. If you can get a Gimp 2.8 that might work for you.

   

ImageMagick - Same as you, I can not see any way of getting a 1 bit png out.
Reply
#5
(11-05-2022, 08:40 PM)rich2005 Wrote: This has come up before see: https://www.gimp-forum.net/Thread-Export...with-Alpha

I do not know how you get a anti-alised 8-bit palette, even with Gimp 2.10 which throws in an extra indexed entry you just get 2 

Work-flow:
Black-on-White image
Colour-to-Alpha to make black on transparent
Mode -> Indexed 1 bit.

You do not say which OS you are using. If you can get a Gimp 2.8 that might work for you.



ImageMagick - Same as you, I can not see any way of getting a 1 bit png out.

Hi rich2005,

I just found that link myself but thanks!

My GIMP doesn't allow me to create a black+white (1-bit) image.  Minimum is 8-bit.

Every package seems determined to turn a bitmap into a grayscale at every opportunity, and to antialias screen rendering in the viewer, so it's often impossible to see whether the image itself is a bitmap or grayscale.  Even the window manager is probably involved in this...  Anyway, I'll update here when I've done some more experimenting. 

I'm using  GIMP 2.10.30 on Ubuntu 18.04.  Due for a system rebuild, but too much on to do it right now..  Sad

I'm using an AppImage, so maybe I'll try the older version with that.  Smile
No AppImage for 2.8 I'll just need to manage with current limitations for now.  Basically, I'm trying to get pixel level control over grayscale rendering using the 'newsprint' dot screen filter.  It's very annoying to have this option removed, presumably based on the assumption that antialiasing and grayscale are always better....


Thanks again for the reminder to try ImageMagick, but sounds like it won't get me far...  I don't want extra steps in my workflow if I can help it, but it can be a lifesaver sometimes.

____________________________

UPDATE:

It looks like a PNG exported from a GIMP image created as per your suggestion is 8-bit RGB ...

Code:
$ identify test-1bit-alpha.png
test-1bit-alpha.png PNG 1024x683 1024x683+0+0 8-bit sRGB 4.48KB 0.000u 0:00.000

but it looks like it's 1-bit (black+alpha) under the hood, padded to 8-bits just to use extra disk space or some other misbegotten 'optimisation' ...

Code:
$ identify -verbose test-1bit-alpha.png
Image: test-1bit-alpha.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 1024x683+0+0
  Resolution: 118.11x118.11
  Print size: 8.66988x5.78274
  Units: PixelsPerCentimeter
  Type: Bilevel
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8/1-bit
  Channel depth:
    gray: 1-bit
    alpha: 1-bit
  Channel statistics:
    Pixels: 699392
    Gray:
      min: 0 (0)
      max: 0 (0)
      mean: 0 (0)
      standard deviation: 0 (0)
      kurtosis: 0
      skewness: 0
      entropy: -nan
    Alpha:
      min: 0 (0)
      max: 255 (1)
      mean: 51.7903 (0.203099)
      standard deviation: 102.588 (0.402306)
      kurtosis: 0.178562
      skewness: -1.476
      entropy: -nan
  Alpha: graya(0,0)   #00000000
  Colors: 2
  Histogram:
    557346: (  0,  0,  0,  0) #00000000 graya(0,0)
    142046: (  0,  0,  0,255) #000000FF graya(0,1)
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: graya(0,1)
  Border color: graya(223,1)
  Matte color: graya(189,1)
  Transparent color: graya(0,0)
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 1024x683+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    Comment: Created with GIMP
    date:create: 2022-11-06T11:46:11+13:00
    date:modify: 2022-11-06T11:46:11+13:00
    icc:copyright: Public Domain
    icc:description: GIMP built-in sRGB
    icc:manufacturer: GIMP
    icc:model: sRGB
    png:bKGD: chunk was found (see Background color, above)
    png:iCCP: chunk was found
    png:IHDR.bit-depth-orig: 2
    png:IHDR.bit_depth: 2
    png:IHDR.color-type-orig: 3
    png:IHDR.color_type: 3 (Indexed)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 1024, 683
    png:pHYs: x_res=11811, y_res=11811, units=1
    png:PLTE.number_colors: 3
    png:text: 1 tEXt/zTXt/iTXt chunks were found
    png:tIME: 2022-11-05T22:46:11Z
    png:tRNS: chunk was found
    signature: 17cf50864f09dbe815449d6c9f96b0fabab283430f0375567ac4d732da83e9f7
  Profiles:
    Profile-icc: 672 bytes
  Artifacts:
    filename: test-1bit-alpha.png
    verbose: true
  Tainted: False
  Filesize: 4.48KB
  Number pixels: 699K
  Pixels per second: 69.94MB
  User time: 0.020u
  Elapsed time: 0:01.010
  Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

I may get there yet...  Smile

Cheers,
bitrat
Reply
#6
(11-05-2022, 10:34 PM)bitrat Wrote: Hi rich2005,

I just found that link myself but thanks!

My GIMP doesn't allow me to create a black+white (1-bit) image.  Minimum is 8-bit.

There is a difference between the image in Gimp and was it exported (otherwise you wouldn't export JPEG from 32-bit FP images).

I tried this:
  • Create an image (white) fill a square with black
  • Create a palette with two colors; black and white
  • Image > Mode > Indexed and use the palette created above
  • Export as PNG (auto pixel format, will create an indexed PNG)
Result:

   

Code:
01:40:28 @ ~/ : >file /tmp/OneBPP.png
/tmp/OneBPP.png: PNG image data, 600 x 400, 1-bit colormap, interlaced

01:42:03 @ ~/ : >identify -verbose /tmp/OneBPP.png
Image: /tmp/OneBPP.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: PseudoClass
  Geometry: 600x400+0+0
  Resolution: 28.35x28.35
  Print size: 21.164x14.1093
  Units: PixelsPerCentimeter
  Colorspace: sRGB
  Type: Bilevel
  Base type: Undefined
  Endianess: Undefined
  Depth: 8/1-bit
  Channel depth:
    red: 1-bit
    green: 1-bit
    blue: 1-bit
  Channel statistics:
    Pixels: 240000
    Red:
      min: 0  (0)
      max: 255 (1)
      mean: 76.8124 (0.301225)
      standard deviation: 116.992 (0.458791)
      kurtosis: -1.24916
      skewness: 0.866513
      entropy: 0.882783
    Green:
      min: 0  (0)
      max: 255 (1)
      mean: 76.8124 (0.301225)
      standard deviation: 116.992 (0.458791)
      kurtosis: -1.24916
      skewness: 0.866513
      entropy: 0.882783
    Blue:
      min: 0  (0)
      max: 255 (1)
      mean: 76.8124 (0.301225)
      standard deviation: 116.992 (0.458791)
      kurtosis: -1.24916
      skewness: 0.866513
      entropy: 0.882783
  Image statistics:
    Overall:
      min: 0  (0)
      max: 255 (1)
      mean: 76.8124 (0.301225)
      standard deviation: 116.992 (0.458791)
      kurtosis: -1.24915
      skewness: 0.866516
      entropy: 0.882783
  Colors: 2
  Histogram:
    167706: (  0,  0,  0) #000000 black
     72294: (255,255,255) #FFFFFF white
  Colormap entries: 2
  Colormap:
         0: (  0,  0,  0) #000000 black
         1: (255,255,255) #FFFFFF white
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: PNG
  Intensity: Undefined
  Compose: Over
  Page geometry: 600x400+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2022-11-06T01:40:20+01:00
    date:modify: 2022-11-06T01:40:20+01:00
    png:IHDR.bit-depth-orig: 1
    png:IHDR.bit_depth: 1
    png:IHDR.color-type-orig: 3
    png:IHDR.color_type: 3 (Indexed)
    png:IHDR.interlace_method: 1 (Adam7 method)
    png:IHDR.width,height: 600, 400
    png:pHYs: x_res=2835, y_res=2835, units=1
    png:PLTE.number_colors: 2
    png:sRGB: intent=0 (Perceptual Intent)
    png:text: 1 tEXt/zTXt/iTXt chunks were found
    png:text-encoded profiles: 1 were found
    png:tIME: 2022-11-06T00:40:20Z
    signature: 57ab66a2a4259e7d6d1351b2fbcb79e287ad34c0428b5cb3cd405e0d082a48bf
  Profiles:
    Profile-exif: 15064 bytes
  Artifacts:
    filename: /tmp/OneBPP.png
    verbose: true
  Tainted: False
  Filesize: 34712B
  Number pixels: 240000
  Pixels per second: 24MB
  User time: 0.000u
  Elapsed time: 0:01.009
  Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Reply
#7
Thanks Ofnuts. I'm getting close. If only I could replace those white pixels with transparent, and persuade the whole thing to render from Inkscape, in colour ...

If I render the bw image from Inkscape using 'crisp-edges- render mode, it doesn't add gray, levels but this doesn't work for the one with alpha.

I can do wiw in GIMP so all good. Thank you. Smile
Reply
#8
(11-06-2022, 07:04 AM)bitrat Wrote: Thanks Ofnuts.  I'm getting close.  If only I could replace those white pixels with transparent, and persuade the whole thing to render from Inkscape, in colour ...

If I render the bw image from Inkscape using 'crisp-edges- render mode, it doesn't add gray, levels but this doesn't work for the one with alpha.

I can do wiw in GIMP so all good.  Thank you.  Smile

Once you have a two-color colormap, with GIF it is just a matter of marking one of the colors as transparent (with PNG it is different, opacity is a mask). But if it is consumed by Inkscape, why do you care about the internal representation? And what is your final target image format?
Reply
#9
Quote:..My GIMP doesn't allow me to create a black+white (1-bit) image.  Minimum is 8-bit...

Not true, just the way IM reports.  You can always compare file sizes. This the same image, exported as a 1bit indexed file and then exported as 8bit RGBA. 

   

Edit: If you want IM to report as 1 bit then the same indexed - 1 bit image exported as a tiff.

   

That is me out, best of luck
Reply
#10
(11-06-2022, 08:49 AM)Ofnuts Wrote: But if it is consumed by Inkscape, why do you care about the internal representation? And what is your final target image format?

Many years ago, CorelDraw could import 1-bit black+white images and render each pixel with either of two arbitrary colours (defined as RGBA, HSV, Pantone, or whatever).

The arbitrary colours were not encoded in the imported bitmap.   CorelDraw used one attribute (pen) to set the colour of the 'black' pixels, and another (fill) to set the 'white' ones.

On import, CorelDraw rendered black+white as black+transparent by default. 

By overlaying and aligning multiple same size bitmaps, it was possible to control the colour and transparency of each pixel in the image.  With care, different sized bitmaps could be overlaid, but I forget how I registered them.

I'm trying to accomplish something similar.




(11-06-2022, 11:29 AM)rich2005 Wrote: Not true, just the way IM reports.  You can always compare file sizes. This the same image, exported as a 1bit indexed file and then exported as 8bit RGBA. 

Edit: If you want IM to report as 1 bit then the same indexed - 1 bit image exported as a tiff.

Thanks rich2005, you've given me some good ideas.

File size is somewhat obscured by compression.  Export to BMP is uncompressed by default, but it doesn't do alpha.  Can't seem to find any settings to disable compression in other formats.  Also, tif export of my source image is buggy in my GIMP.

All that said, I don't think spelunking image formats will solve my problem.

As per above, what I need is to:

  1. overlay multiple 1-bit bitmaps, with pixel registration.
  2. map arbitrary rgba values to the '0' and '1' pixels in each overlay. (ie, colour-0 in place of 0 and colour-1 in place of 1).






I've figured it out!  

I can do it with layer masks. 

I was too focused on bit width, but I just need to copy my 1-bit bitmaps onto the masks.



EXCEPT....

The advantage of using CorelDraw or Inkscape is that they render colours subtractively (like inks), while GIMP's is additive (like prisms).

Maybe something like the layer mode set to Subtract would work.  That doesn't do what I want, but there are lots of modes.  

Can anyone suggest a way to have red, green and blue add up to black, not white?
Reply


Forum Jump: