質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

1654閲覧

ImageViewに表示した画像の保存

shikasama

総合スコア163

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2017/12/27 07:24

###前提・実現したいこと
ImageViewに表示した画像を内部に保存しようとしています。
保存した画像を開いてみると、
破損しているためか、表示できません。

###発生している問題・エラーメッセージ

PCから開いたときのイメージ
イメージ説明

###該当のソースコード

kotlin

1var bmp : Bitmap? = null 2var imageSize = 0 3 4// byte配列をBitmapオブジェクトに変換 5if(this.imageData != null) { 6 imageSize = this.imageData?.size ?: 0 7 bmp = BitmapFactory.decodeByteArray(this.imageData, 0, imageSize) 8} 9 10// BitmapオブジェクトをImageViewに表示 11val iv = ivScreenImage as ImageView 12iv.setImageBitmap(bmp) 13 14var fileName = etFileName.text.toString() 15when(rgImageFormat.checkedRadioButtonId) { 16 R.id.rbBmp -> fileName += ".bmp" // BMP形式 17 R.id.rbJpg -> fileName += ".jpg" // JPG形式 18 R.id.rbPng -> fileName += ".png" // PNG形式 19 else -> {} 20} 21 22ar filePath : String? = "" 23when(rgMedia.checkedRadioButtonId) { 24 // ローカル 25 R.id.rbLocal -> filePath = filesDir.toString() + "/" 26 // 内部ストレージ 27 R.id.rbIntStorage -> filePath = FileManager.getAccessPath(applicationContext, StorageLocation.INTERNAL_STORAGE) 28 // 外部SDカード 29 R.id.rbSDCard -> filePath = FileManager.getAccessPath(applicationContext, StorageLocation.EXTERNAL_SD) 30 else -> {} 31} 32 33var imgData : ByteArray? = imageData 34 35if(rgImageFormat.checkedRadioButtonId == R.id.rbJpg) { 36 // JPG形式の場合 37 38 // byte配列をBitmapオブジェクトに変換 39 var bmp : Bitmap? = null 40 var imageSize = 0 41 if(imgData != null) { 42 imageSize = imageData?.size ?: 0 43 bmp = BitmapFactory.decodeByteArray(imageData, 0, imageSize) 44 } 45 46 if(imageSize == 0) { 47 Toast.makeText(applicationContext, "imageData size is 0.", Toast.LENGTH_LONG).show() 48 return 49 } 50 51 val baos = ByteArrayOutputStream() 52 // Bitmap から .jpg ファイルを作成する 53 bmp?.compress(Bitmap.CompressFormat.JPEG, 100, baos) 54 // BitmapオブジェクトをJPG形式のbyte配列に変換 55 imgData = baos.toByteArray() 56} 57 58val sb = StringBuilder() 59 60val fileManager = FileManager() 61imgData?.let { 62 // 画像データを保存 63 fileManager.saveFile(applicationContext, filePath, fileName, imgData, true, sb) 64}

kotlin

1fun saveFile(context: Context, filePath: String, fileName: String, data: ByteArray, isBinary: Boolean, sbMsg: StringBuilder): Boolean { 2 var ret = false 3 var message : String? = "" 4 5 try { 6 // ファイルパス作成 7 var path = filePath 8 var slashLastIndex = path.lastIndexOf("/") 9 var length = path.length 10 path = if(slashLastIndex != length -1) { 11 path + "/" + fileName 12 } else { 13 path + fileName 14 } 15 16 // ディレクトリ作成 17 val file = File(path) 18 file.parentFile.mkdir() 19 20 if(isBinary == true) { 21 // バイナリ 22 BufferedOutputStream(FileOutputStream(File(path), false)).use { 23 it.write(data) 24 } 25 } else { 26 // テキスト 27 OutputStreamWriter(FileOutputStream(File(path), false)).use { 28 it.write(String(data)) 29 } 30 } 31 32 // メディアスキャナーにファイルのスキャンを要求する 33 ret = this.scanFile(context, path, null) 34 message = if(ret == true) { MSG_FILE_SAVE_SUCCESS } 35 else { 36 MSG_FILE_SCAN_FAILED 37 } 38 } catch (e: FileNotFoundException) { 39 message = e.message 40 e.printStackTrace() 41 } catch (e: IOException) { 42 message = e.message 43 e.printStackTrace() 44 } catch (e: Exception) { 45 message = e.message 46 e.printStackTrace() 47 } 48 49 sbMsg.append(message) 50 51 return ret 52}

###補足情報(言語/FW/ツール等のバージョンなど)
android studio 3.0.1
kotlin 1.2.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/12/27 07:49 編集

他のビュワーではどうでしょうか?Android端末では正しく表示されるのでしょうか?
shikasama

2017/12/27 07:54

Androidタブで、 フォトで開いた場合→メディアなし、ギャラリーで開いた場合→画像アイコンにスラッシュが書かれたマーク表示 となりました。
guest

回答2

0

自己解決

保存場所がローカルになっていたので他アプリから読み込めなかったのではないかと思います。
内部ストレージを指定して保存すると、ギャラリーからでも見ることができました。

投稿2017/12/28 06:37

shikasama

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Bitmap#compresを使うと簡単に保存できますよ。

投稿2017/12/27 10:48

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問