喫茶XRAYトップページ

[▲前のスレッド]

[12813] ImageMagickにて返信 削除
2019/5/7 (火) 00:51:02 Sara
皆様、こんばんわ

最近、ImageMagickを使って遊んでいるのですが・・・

Bitmapへの変換で困っています。

単純な変換は以下でできます。

    MagickWandGenesis;
    Mem := TMemoryStream.Create;
    try
      cnt := 0;
      Lwand := NewMagickWand;
      ret := MagickReadImage(Lwand, PChar(UTF8Encode(FileName)));
      if  ret = 0 then exit;

      HasAlpha := MagickGetImageAlphaChannel(Lwand) = MagickTrue;
      MagickSetImageFormat(Lwand,Pchar(UTF8Encode('BMP3')));
      New(PB);
      PB := MagickGetImagesBlob(Lwand,@cnt);
      _TStream(mem).SetPointer(PB, cnt);
      Mem.Position := 0;
      Bmp.LoadFromStream(Mem);
    finally
      Mem.Free;
      DestroyMagickWand(Lwand);
    end;

で、なにに困っているか・・・アルファチャンネル付きの画像を
上記で変換すると、綺麗さっぱりアルファチャンネルが抜け落ちます。
Mem.SaveToFile('D:\test.bmp');とすると、24Bit Bitmapになります。

問題は、 PB := MagickGetImagesBlob(Lwand,@cnt); です。

ここを、MagickWriteImage(Lwand,pchar(UTF8Encode('D:\test.bmp')));

とかすると、正常にアルファチャンネル付きBitmapが出来上がりますが、
ファイルに保存したくない・・・

MagickGetImagesBlobでアルファチャンネル付きでメモリに保存する方法って
あるんでしょうかね・・・

お分かりになる方がいらっしゃれば、ご教示いただけると幸いです。

 

[12814] Re:ImageMagickにて返信 削除
2019/5/7 (火) 07:36:10 Mr.XRAY
▼ Saraさん

> MagickGetImagesBlobでアルファチャンネル付きでメモリに保存する方法って
> あるんでしょうかね・・・


ImageMagick の記事は掲載しているけど,私は詳しいことは全くわかりません.
ゴメン !!

imagemagick alpha でググると結構ヒットするので苦労している方がいるようです.


[12817] Re:ImageMagickにて返信 削除
2019/5/7 (火) 08:30:46 SO
▼ Saraさん

>       MagickSetImageFormat(Lwand,Pchar(UTF8Encode('BMP3')));

https://qiita.com/yoya/items/3d588687a30175601885

BMPv4 で追加された RGBAMask で透明度に対応したらしいです。。。?

[12821] Re2:ImageMagickにて返信 削除
2019/5/7 (火) 09:51:00 SO
▼ Saraさん

> BMPv4 で追加された RGBAMask で透明度に対応したらしいです。。。?

https://imagemagick.org/script/formats.php

デフォルトでv4らしいので、
MagickSetImageFormat(Lwand,Pchar(UTF8Encode('BMP')));
でOKな気がします。

[12827] Re3:ImageMagickにて返信 削除
2019/5/7 (火) 17:22:57 Sara
▼ SOさん
▼ マスター

ご連絡ありがとうございます。
 
> > BMPv4 で追加された RGBAMask で透明度に対応したらしいです。。。?
>
> https://imagemagick.org/script/formats.php
>
> デフォルトでv4らしいので、
> MagickSetImageFormat(Lwand,Pchar(UTF8Encode('BMP')));
> でOKな気がします。



もともと
 MagickSetImageFormat(Lwand,Pchar(UTF8Encode('BMP')));
を使っていたのですが、上手くいかなくて何処かの記事でBMP3を見つけて
使ってみました。(BMPがVer4とは知らず・・(^^;)

しかし、いずれにしても

 PB := MagickGetImagesBlob(Lwand,@cnt);

だと、アルファチャンネルデータが消えてなくなる・・・ので、
(何か勘違いしていなければ・・・ 帰ってから再度試しますが)

で、

MagickBooleanType MagickWriteImagesFile(
    MagickWand* wand,
    FILE* file
)

を使って、CreateFileで FILE_ATTRIBUTE_TEMPORARY を指定して旨い事
できないかと試したものの、宣言の仕方が悪いのか例外が発生する・・・

ちなみに、上記の宣言はDelphiだとどうなるのでしょうか・・・(^^;



[12828] Re4:ImageMagickにて返信 削除
2019/5/7 (火) 17:42:53 SO
▼ Saraさん

>
> しかし、いずれにしても
>
>  PB := MagickGetImagesBlob(Lwand,@cnt);
>
> だと、アルファチャンネルデータが消えてなくなる・・・ので、
> (何か勘違いしていなければ・・・ 帰ってから再度試しますが)


そもそも、透過する色は指定してますか?
ぱっと見たソースだと指定してないように見えます。。。


> MagickBooleanType MagickWriteImagesFile(
>     MagickWand* wand,
>     FILE* file
> )
>
> を使って、CreateFileで FILE_ATTRIBUTE_TEMPORARY を指定して旨い事
> できないかと試したものの、宣言の仕方が悪いのか例外が発生する・・・
>
> ちなみに、上記の宣言はDelphiだとどうなるのでしょうか・・・(^^;


分かりません!!


[12829] Re5:ImageMagickにて返信 削除
2019/5/7 (火) 18:35:36 Sara
▼ SOさん こんばんわ

> > しかし、いずれにしても
> >
> >  PB := MagickGetImagesBlob(Lwand,@cnt);
> >
> > だと、アルファチャンネルデータが消えてなくなる・・・ので、
> > (何か勘違いしていなければ・・・ 帰ってから再度試しますが)
>
> そもそも、透過する色は指定してますか?
> ぱっと見たソースだと指定してないように見えます。。。


おぅ・・わかりづらくて、ごめんなさい。前提条件が無いですね・・・

ret := MagickReadImage(Lwand, PChar(UTF8Encode(FileName)));

で、テスト的に読み込みをしているのがアルファチャンネル付きPNGファイルです。

なので、そのままMagickWriteImageで書き出すとアルファチャンネル付きBMPに

なるわけですが、MagickGetImagesBlobでメモリに出力すると・・と言う話になるわけです。

もう少し、いじってみます。



[12830] Re6:ImageMagickにて返信 削除
2019/5/7 (火) 18:43:09 SO
▼ Saraさん

なんですかね?

HasAlpha := MagickGetImageAlphaChannel(Lwand) = MagickTrue;

HasAlphaはTrueを返すんですよね?

[12831] Re7:ImageMagickにて返信 削除
2019/5/7 (火) 18:46:32 Sara
▼ SOさん
>
> なんですかね?
>
> HasAlpha := MagickGetImageAlphaChannel(Lwand) = MagickTrue;
>
> HasAlphaはTrueを返すんですよね?



Trueになります。


なにか、大勘違いしてますかね・・・(^^;

[12832] Re8:ImageMagickにて返信 削除
2019/5/7 (火) 19:23:23 Sara
▼ SOさん
> >
> > なんですかね?
> >
> > HasAlpha := MagickGetImageAlphaChannel(Lwand) = MagickTrue;
> >
> > HasAlphaはTrueを返すんですよね?
>
>
> Trueになります。
>
>
> なにか、大勘違いしてますかね・・・(^^;



とりあえず、解決しました・・・


      PB := MagickGetImagesBlob(Lwand,@cnt);
      _TStream(mem).SetPointer(PB, cnt);
      Mem.Position := 0;
      Bmp.LoadFromStream(Mem);
      Bmp.SaveToFile('D:\test.bmp');

で、アルファチャンネル付きBMPが出力されることが確認できました。
Mem.SaveToFileでも正常にアルファチャンネル付きBMPになります。
(そりゃ、そうだ)


原因がわかりません・・・(^^;

今日テストしたら、24BitのBmpで出力されません・・・
PCの誤動作だったのでしょうか・・・

昨日は随分悩んだのですが・・・(^^;

と、いうわけで、大変お騒がせいたしました。m(_ _)m

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82