トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     setPixel32で設定した値のgetPixel32での読み込みについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
oblivion
Åê¹ÆNo.47744
投稿日時: 2011-7-15 19:59
新米
居住地:
投稿: 3
使用環境:
WinXP
Flex SDK 4
setPixel32で設定した値のgetPixel32での読み込みについて
はじめまして


ActionScript3.0のBitmapDataクラスのgetPixel32について質問があるのですが、



setPixel32で設定したuintの色情報が、設定色のアルファが低い時にgetPixel32で正しく(setしたときとまったく同じ値で)取れない問題があります。


例えばアルファが0のとき、rgbが設定されているにもかかわらずgetPixel32の結果は0になってしまいます。

0x00123456→0x0

この問題を解決する方法はなにかございますでしょうか?




また、解決する方法がなかった場合ですが、
アルファが低い時問題が起こると言いましてもアルファが0xa0のときでも、

0xa0111111→0xa0101010

と正しいuintがとれません。


一見するとアルファが0xddの時はこの問題が起こらないように見えますが、どのrgbでも確実にこの問題が起こらないような閾値のアルファというものは(0xff未満で)存在するのでしょうか。
ご存知でしたら値を教えてください。



本当に使いたいのはget/setVectorメソッドなのですが、便宜のためget/setPixcel32と同じものと勝手に判断してget/setPixcel32としました。

get/setVectorメソッドがget/setPixcel32と内部的に違う挙動でget/setVectorのほうには解決策がある場合でしたらそちらでお願い致します。


よろしくお願いします。
oblivion
Åê¹ÆNo.47745
投稿日時: 2011-7-16 11:41
新米
居住地:
投稿: 3
使用環境:
WinXP
Flex SDK 4
Re: setPixel32で設定した値のgetPixel32での読み込みについて
下記のような、
あるアルファに対してすべてのrgbでgetPixcel32とsetPixcel32の一致しなかった回数をカウントするチェックプログラムを書いてみましたが、
0xfeからもうダメそうでした・・・


package {
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;

	/**
	 * ...
	 * @author
	 */
	[SWF(width="512",height="512")]
	public class Main extends Sprite {

		private var errorCount:uint = 0;
		private var bd:BitmapData;
		private var tf:TextField;
		private var a:uint = 0xff;
		private var r:uint = 0x0;

		public function Main():void {
			stage.frameRate = 120;
			bd = new BitmapData(1, 1, true);
			tf = new TextField();
			tf.height = 500;
			tf.width = 200;
			tf.border = true;
			addChild(tf);
			addEventListener(Event.ENTER_FRAME, onEnter);
		}

		private function onEnter(e:Event):void {
			step();
			r++;
			if (r == 0x100){
				tf.text = "0x" + a.toString(16) + " : " + errorCount + "\n" + tf.text;
				errorCount = 0;
				r = 0x0;
				if (a == 0x0){
					removeEventListener(Event.ENTER_FRAME, onEnter);
				} else {
					a--;
				}
			}
		}

		private function step():void {
			var col:uint = (a << 24) | (r << 16);
			for (var i:int = 0; i < 0xffff; i++){
				check(col | i);
			}
		}

		private function check(color:uint):void {
			bd.setPixel32(0, 0, color);
			if (bd.getPixel32(0, 0) != color){
				errorCount++;
			}
		}

	}
}


また、getPixcel32ではアルファは正しく取れるようなので
setPixcel32でセットしたBitmapDataを
アルファはgetPixcel32で取った値を
rgbはgetPixcelで取った値を
読んでみましたが同じくrgbのほうがダメそうです。


getPixcel32って32bitのuint値を得たいという目的で使うためにあると思うのですが、これでは意味がないのでは・・・?
vader
Åê¹ÆNo.47754
投稿日時: 2011-7-19 14:37
常連
居住地: 東京
投稿: 76
使用環境:
MacOS10.8,FlashCS6
Re: setPixel32で設定した値のgetPixel32での読み込みについて
oblivionさん、こんにちわ。

私の環境でテストして見ましたが、確かにおっしゃる通り正しい値がとれませんでした。ちなみに私の環境、Mac 10.6 FlashCS5では

0xa0111111→0xa0121212

となりました。

下記、Adobeのリファレンスを見てみると、getPixel32()に関しては乗算済みカラー値(英語ではpremultiplied color values)と表現されており、問題が生じる旨も記述されています。

http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/

そこで、最初の投稿で書かれていたようにget/setVector()であれば、符号なし整数(32 ビットの乗算されないピクセル値)(英語ではunsigned integers (a 32-bit unmultiplied pixel value) )と書かれていたので、試してみましたが、残念ながら結果は変わらずでした。

get/setVector()に関しては、これまで使用したことがないので、テスト方法が間違えているかもしれませんが、一応、私のテストしたコードを載せておきます。


package {
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;

	public class GetVectorTest extends Sprite {
		private var bitmap:Bitmap;
		private var bitmapData:BitmapData;
		public function GetVectorTest() {
			bitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0xffffffff);
			bitmap = new Bitmap(bitmapData);
			addChild(bitmap);
			stage.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		private function clickHandler(e:MouseEvent):void {
			var rect:Rectangle = new Rectangle(e.stageX, e.stageY, 1, 1);
			var setVector:Vector.<uint> = new Vector.<uint>();
			setVector[0] = 0xa0111111;
			bitmapData.setVector(rect, setVector);
			var getVector:Vector.<uint> = bitmapData.getVector(rect);
			trace(getVector[0].toString(16));
		}
	}
}


ちょっと私程度の実力ではお手上げ状態です。お力になれずすみません。
頑張って下さい。
oblivion
Åê¹ÆNo.47756
投稿日時: 2011-7-20 10:23
新米
居住地:
投稿: 3
使用環境:
WinXP
Flex SDK 4
Re: setPixel32で設定した値のgetPixel32での読み込みについて
vaderさん、テストありがとうございます。

画像にデータを埋め込もうと考えていたのですが、1ピクセルに32ビットは無理そうですね・・・

アルファが0xFF固定の24ビットまでになってしまいますが、これで検討しようかと思います。


1ピクセル3バイトなら4ピクセルでint変数3つぶん
8ピクセルでNumber変数3つぶん

展開処理がめんどくさそうですね・・
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops