[解決済み] AndroidにおけるBufferedImage
2022-02-15 02:23:14
質問
カメラで撮影してJPEGでSDカードに保存するアプリがあるのですが、スフェリーズフィルターで画像を歪ませたいと思っています。javax.imageioがアンドロイドでサポートされていないことは理解していますが、jpegをbufferedimageとしてメモリに読み込む方法はありますか?
ありがとうございます。
/*
Copyright 2006 Jerry Huxtable
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.jhlabs.image;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
/**
* A filter which simulates a lens placed over an image.
*/
public class SphereFilter extends TransformFilter {
private float a = 0;
private float b = 0;
private float a2 = 0;
private float b2 = 0;
private float centreX = 0.5f;
private float centreY = 0.5f;
private float refractionIndex = 1.5f;
private float icentreX;
private float icentreY;
public SphereFilter() {
setEdgeAction( CLAMP );
setRadius( 100.0f );
}
/**
* Set the index of refaction.
* @param refractionIndex the index of refaction
* @see #getRefractionIndex
*/
public void setRefractionIndex(float refractionIndex) {
this.refractionIndex = refractionIndex;
}
/**
* Get the index of refaction.
* @return the index of refaction
* @see #setRefractionIndex
*/
public float getRefractionIndex() {
return refractionIndex;
}
/**
* Set the radius of the effect.
* @param r the radius
* @min-value 0
* @see #getRadius
*/
public void setRadius(float r) {
this.a = r;
this.b = r;
}
/**
* Get the radius of the effect.
* @return the radius
* @see #setRadius
*/
public float getRadius() {
return a;
}
/**
* Set the centre of the effect in the X direction as a proportion of the image size.
* @param centreX the center
* @see #getCentreX
*/
public void setCentreX( float centreX ) {
this.centreX = centreX;
}
public float getCentreX() {
return centreX;
}
/**
* Set the centre of the effect in the Y direction as a proportion of the image size.
* @param centreY the center
* @see #getCentreY
*/
public void setCentreY( float centreY ) {
this.centreY = centreY;
}
/**
* Get the centre of the effect in the Y direction as a proportion of the image size.
* @return the center
* @see #setCentreY
*/
public float getCentreY() {
return centreY;
}
/**
* Set the centre of the effect as a proportion of the image size.
* @param centre the center
* @see #getCentre
*/
public void setCentre( Point2D centre ) {
this.centreX = (float)centre.getX();
this.centreY = (float)centre.getY();
}
/**
* Get the centre of the effect as a proportion of the image size.
* @return the center
* @see #setCentre
*/
public Point2D getCentre() {
return new Point2D.Float( centreX, centreY );
}
public BufferedImage filter( BufferedImage src, BufferedImage dst ) {
int width = src.getWidth();
int height = src.getHeight();
icentreX = width * centreX;
icentreY = height * centreY;
if (a == 0)
a = width/2;
if (b == 0)
b = height/2;
a2 = a*a;
b2 = b*b;
return super.filter( src, dst );
}
protected void transformInverse(int x, int y, float[] out) {
float dx = x-icentreX;
float dy = y-icentreY;
float x2 = dx*dx;
float y2 = dy*dy;
if (y2 >= (b2 - (b2*x2)/a2)) {
out[0] = x;
out[1] = y;
} else {
float rRefraction = 1.0f / refractionIndex;
float z = (float)Math.sqrt((1.0f - x2/a2 - y2/b2) * (a*b));
float z2 = z*z;
float xAngle = (float)Math.acos(dx / Math.sqrt(x2+z2));
float angle1 = ImageMath.HALF_PI - xAngle;
float angle2 = (float)Math.asin(Math.sin(angle1)*rRefraction);
angle2 = ImageMath.HALF_PI - xAngle - angle2;
out[0] = x - (float)Math.tan(angle2)*z;
float yAngle = (float)Math.acos(dy / Math.sqrt(y2+z2));
angle1 = ImageMath.HALF_PI - yAngle;
angle2 = (float)Math.asin(Math.sin(angle1)*rRefraction);
angle2 = ImageMath.HALF_PI - yAngle - angle2;
out[1] = y - (float)Math.tan(angle2)*z;
}
}
public String toString() {
return "Distort/Sphere...";
}
}
解決方法は?
いいえ。
BufferedImage
というのは、おっしゃるように
javax.imageio
はAndroid SDKに含まれていません。そのため
Bitmap
クラスは、個々のピクセルの取得をサポートしています。
getPixel()
と
getPixels()
メソッドがあるので、これらを使ってどんなタイプの画像変換もできるはずです。
関連
-
[解決済み] コンパイルした.apkを端末にインストールしようとするとINSTALL_FAILED_UPDATE_INCOMPATIBLEが表示される
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み] Androidのローテーションでアクティビティを再開する
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] シンボル 'context' を解決できない
-
[解決済み】Edit Textのandroid:ems属性とは何ですか?[重複しています]
-
[解決済み】アンドロイドクロームブラウザのモバイルウェブアプリケーションのメニューでHTMLユニコード ☰が検出されない。
-
[解決済み】フラグメントMyFragmentがアクティビティにアタッチされない。
-
[解決済み】アクティビティにない場所でのgetLayoutInflater()の呼び出し
-
[解決済み】android.content.res.Resources$NotFoundExceptionの取得:androidにリソースが存在する場合でも例外が発生する。
-
[解決済み] sendUserActionEvent() は null です。
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] Android Fragment no view found for ID?
-
[解決済み] Android Fragment onAttach() 非推奨