【发布时间】:2015-05-19 09:06:44
【问题描述】:
Bitmap.Factory 不会将带有 png 图像数据的字节数组解码为位图。 png 数据是从 mp3 的 id3 标签中收集的。
byte[] imageBytes = getImageFrameData("APIC", imageType, _id3TagByteArray);
//!convert frame data bytes to image
if(imageBytes != null) {
image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}
我做错了吗?位图工厂总是返回 null。
getImageFrameData
private byte[] getImageFrameData(String frameID, byte imageType, byte[] ID3tag){
/////////////////
/*
variable position is initialized to 10 in order to skip ID3 header
(this must be improved in order to account for potential extended id3 header)
*/
//!check for extended id3 header (to be implemented)
final int FRAME_ID_LENGTH = 4;
final int DATA_LENGTH = 4;
final int FLAG_LENGTH = 2;
final int HEADER_LENGTH = FRAME_ID_LENGTH + DATA_LENGTH + FLAG_LENGTH;
final int TEXT_ENC_LENGTH = 1;
final int PICT_TYPE_LENGTH = 1;
List<Byte> fMimeType = new ArrayList<Byte>();
int position = 10;
int fInfoPos = position;
byte[]frame = null;
while(true){//!loop for seeking frames
//!Get Frame Id of current frame in loop
byte[] fID = getBytesInRange(ID3tag, fInfoPos, FRAME_ID_LENGTH);//^search start skips ten bytes
//!Get Size of Frame Data
byte[] fSize = getBytesInRange(ID3tag, fInfoPos+=fID.length, DATA_LENGTH);
int frameDataSize = decodeSynchsafe(fSize);
//!Get Frame Header Flags (to be implemented)
byte[] fFlags = getBytesInRange(ID3tag, fInfoPos+=fSize.length, FLAG_LENGTH);
try {
if (frameID.equals(new String(fID, "UTF-8"))) {
//!process image frame
//!!get additional information data from image frame
//!!!get text encoding
byte[] fTextEnc = getBytesInRange(ID3tag, fInfoPos+=fFlags.length, TEXT_ENC_LENGTH);
//!!!get MIME type
for(int i = fInfoPos+=fTextEnc.length; i < ID3tag.length - 1; i++){
if(ID3tag[i] != 0){
fMimeType.add(ID3tag[i]);
}else{
fInfoPos += fMimeType.size() + 1;
break;
}
}
////////////////
byte[]mimeTypeData = new byte[fMimeType.size()];
for(int i = 0; i < mimeTypeData.length; i++){
mimeTypeData[i] = fMimeType.get(i);
}
String mime = new String(mimeTypeData);
///////////////
//!!!get image type
byte[] imgType = getBytesInRange(ID3tag, fInfoPos, PICT_TYPE_LENGTH);
//!!!get Description
List<Byte>fDescList = new ArrayList<>();
for(int i = fInfoPos+=imgType.length; i < ID3tag.length - 1; i++){
if(ID3tag[i] != 0){
fDescList.add(ID3tag[i]);
}else{
fInfoPos += fDescList.size() + 1;//+1
break;
}
}
//?if picture type is that of query
if(imgType[0] == imageType ){
//!get image Frame
imageFrame = getBytesInRange(ID3tag, position, frameDataSize + 10);
}
//!Get Data from Image Frame
int start = fInfoPos - position;/////////HERE
//int end = (frameDataSize) - (fInfoPos - position);
int end = (HEADER_LENGTH + frameDataSize) - start;
byte[] image = getBytesInRange(imageFrame, start, end);
String stop = "stop";
return image;
}else{
//!skip to next frame
position += frameDataSize + HEADER_LENGTH;
fInfoPos = position;
}
}catch(Exception ex){
}
/*
The frame header flags could have important information
which can determine how the frame is to be processed.
*/
/////////////////
//No Frame Exists for the current tag
// (The id3 tag has been scanned and the tag of query doesn't exist
//!break
if(frameDataSize == 0){
break;
}
/////////////////
}
return null;
////////////////
}
【问题讨论】:
-
显示你的
getImageFrameData()函数。 -
好的,我添加了信息。
-
我想字节数组已损坏。但是,我知道数组的前八个字节包含 png 文件的开头。 w3.org/TR/PNG-Structure.html
-
我刚刚读到 png 文件有一个块,表示文件的结尾。所以我会确保完整的数据包含在字节数组中,尽管我很确定它应该是。
标签: android image mp3 bitmapfactory id3